ndthanhdev/mcp-browser-kit

ndthanhdev/mcp-browser-kit

от ndthanhdev
MCP Browser Kit — сервер, который позволяет AI-ассистентам напрямую управлять локальными браузерами. Полезен для автоматизации действий на страницах, сбора данных и тестирования. Разработчики и тес...

MCP Browser Kit

NPM Version Firefox Add-on Chrome Web Store Workspace Updated Checked with Biome Trust Score

mcp-browser-kit MCP server

🚀 On the main branch? You're viewing the bleeding-edge dev docs! For other versions, check out the release/* branches.

An MCP Server that enables AI assistants to interact with your local browsers. It's an alternative to "Claude in Chrome" that works with any AI assistant or coding agent.

https://github.com/user-attachments/assets/1fbf87fd-06d1-42bf-a06f-cc2bbdf375a8

Usage

  1. Add MCP Browser Kit to your MCP Client:

    {
        "mcpServers": {
            "browser-kit": {
                "command": "npx",
                "args": ["@mcp-browser-kit/server@latest"]
            }
        }
    }
    

    By default the server use stdio transport, alternatively you can use http transport:

    npx @mcp-browser-kit/server@latest --transport http
    # optional flags (defaults shown):
    #   --http-host 127.0.0.1
    #   --http-port 21082
    

    Then point your MCP client at the URL instead of a command:

    {
        "mcpServers": {
            "browser-kit": {
                "url": "http://127.0.0.1:21082/mcp"
            }
        }
    }
    

    Security: there's no auth yet, so --http-host defaults to 127.0.0.1 (loopback only). Only pass --http-host 0.0.0.0 (or a LAN address) if you understand that anyone who can reach that host/port can control your browser.

  2. Choose the right extension build for your browser:

    • Check the Compatibility table below to see which build (M2 or M3) is compatible with your browser
    • Note that M2 builds offer more functionality than M3 builds, so prefer M2 if your browser supports both
  3. Download the latest compatible build from The Latest Release.

  4. Load the extension into a compatible browser and enable it.

  5. Refresh open tabs to ensure extension scripts are loaded.

  6. Start messaging on your MCP Client:

    Use browser-kit, star the last open GitHub repo on my browser
    
  7. Optional, check User Notes for more information.

Часто задаваемые вопросы

Инструменты были проиндексированы:
captureTabтолько чтениевнешний мир

Делает скриншот вкладки. Когда: только для вкладок MV2; вам нужны пиксельные координаты для инструментов, работающих с координатами. Как: browserId, windowId, tabId из bk:///context; используйте полученные размеры для вычисления x/y. Требует: browserId, windowId, tabId. Возвращает: value { data (изображение base64), width, height, mimeType } - используйте width/height для масштабирования координат. Избегайте: вызова на manifestVersion 3 - используйте readable-elements.

Снимает скриншот вкладки

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

clickOnCoordinatesвнешний мир

Кликает по пиксельным координатам внутри вкладки. Когда: Резервный вариант для MV2, когда readablePath недоступен. Как: x/y из недавнего скриншота captureTab (такие же ширина и высота); browserId, windowId, tabId из контекста. Требует: browserId, windowId, tabId, x, y. Возвращает: после авто-ожидания значение { changed, navigated, url, added, removed, tooLarge, diff? } - diff показывает читаемые элементы: добавленные (+), удалённые (-) и близлежащие неизменённые, с их идентификаторами. Нет diff, когда tooLarge или navigated: перечитайте readable-elements. При ok=false: заново захватите вкладку и пересчитайте x/y. Избегайте: на MV3 (нет источника скриншотов); предпочитайте clickOnElement, когда readablePath существует.

Кликает по координатам

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

  • xnumberобязательный

    Координата X в пикселях из последнего скриншота captureTab (только для MV2)

  • ynumberобязательный

    Y-координата в пикселях из последнего скриншота captureTab (только для MV2)

clickOnElementвнешний мир

Кликает по элементу по readablePath. Когда: основной способ клика в MV2 и MV3. Как: читает {tabUri}/readable-elements; фильтрует кортежи [path, role, text, value?] по role и text; копирует path точно (например, f1:e1a), а не CSS-селектор. Кастомный dropdown/combobox/datepicker: кликает по триггеру, чтобы открыть его, затем заново читает readable-elements и кликает по опции/ячейке дня. Нативный <select>: клик по опции может сработать для listbox-селектов (multiple или size>1), но однострочные выпадающие списки используют нативный попап, который игнорирует синтетические клики - для них нужен invokeJsFn (MV2) или showHumanHint (MV3). Проверяет повторным чтением и эскалирует. См. Complex inputs. Требует: browserId, windowId, tabId, readablePath. Возвращает: после автоожидания value { changed, navigated, url, added, removed, tooLarge, diff? } - diff показывает добавленные (+), удалённые (-) и соседние неизменённые readable-элементы, с их id элементов. Нет diff, когда tooLarge или navigated: заново читает readable-elements. При ok=false: reason говорит, почему (not visible, disabled, covered by <el>, detached); заново читает readable-elements и выбирает новый id. Избегайте: придумывать пути; заново читать элементы после навигации, если клик не сработал.

Нажимает элемент.

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • readablePathstringобязательный

    Стабильный id элемента (например, f1:e1a) - первый элемент кортежа [path, role, text] из readable-elements; не CSS-селектор

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

closeTabидемпотентныйвнешний мир

Закрывает вкладку. Необратимо. Когда: работа с вкладкой завершена и дальнейшее взаимодействие не требуется. Как: browserId, windowId, tabId из bk:///context. Требует: browserId, windowId, tabId. Возвращает: ok=true после закрытия. Избегайте: закрытия вкладки, которая ещё нужна для дальнейших взаимодействий.

Закрывает вкладку

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

fillTextToCoordinatesвнешний мир

Кликает в точке (x, y), затем вводит текст в сфокусированное поле ввода. Когда: запасной вариант для MV2 для полей без readablePath. Как: координаты из недавнего captureTab; отправка через clickOnCoordinates по кнопке отправки или hitEnterOnCoordinates. Требуется: browserId, windowId, tabId, x, y, value. Возвращает: после авто-ожидания значение { changed, navigated, url, added, removed, tooLarge, diff? } - diff показывает добавленные (+) и удалённые (-) читаемые элементы и соседние неизменённые, с их id элементов. Нет diff при tooLarge или navigated: перечитайте readable-elements. При ok=false: заново захватите вкладку и пересчитайте x/y. Нежелательно: на MV3; предпочтителен fillTextToElement, когда доступен readablePath.

Заполняет текст по координатам

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • valuestringобязательный

    Текст для ввода в поле ввода.

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

  • xnumberобязательный

    Координата X в пикселях из последнего скриншота captureTab (только для MV2)

  • ynumberобязательный

    Y-координата в пикселях из последнего скриншота captureTab (только для MV2)

fillTextToElementвнешний мир

Вводит текст в <input> или <textarea> по readablePath. Когда: основной метод заполнения в MV2 и MV3. Также обрабатывает нативные <input> date/time/datetime-local/month/color, когда значение в точном формате (date YYYY-MM-DD, time HH:MM, datetime-local YYYY-MM-DDTHH:MM, month YYYY-MM, color #rrggbb). Как: readablePath из первого элемента кортежа [path, role, text, value?] в readable-elements; отправляет через clickOnElement по кнопке submit или hitEnterOnElement. Требует: browserId, windowId, tabId, readablePath, value. Возвращает: после автоожидания значение { changed, navigated, url, added, removed, tooLarge, diff? } - diff показывает добавленные (+) и удалённые (-) readable-элементы и соседние неизменённые, с их element ids. Нет diff, когда tooLarge или navigated: перечитайте readable-elements. При ok=false: причина объясняет, почему (не виден, отключён, перекрыт <el>, отсоединён); перечитайте readable-elements и выберите свежий id. Избегайте: CSS-селекторов в качестве readablePath; id элементов, которые удалили или перерисовали. Не работает с contenteditable rich-text редакторами (в MV2 вместо этого invokeJsFn), нативным <select> или кастомными всплывающими dropdowns/datepickers - используйте лестницу стратегий в разделе Complex inputs в инструкциях сервера.

Заполняет элемент текстом

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • readablePathstringобязательный

    Стабильный id элемента (например, f1:e1a) - первый элемент кортежа [path, role, text] из readable-elements; не CSS-селектор

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • valuestringобязательный

    Текст для ввода в поле ввода.

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

getContextтолько чтениевнешний мир

Получает агрегированное состояние каждого подключённого браузера. Когда: ищете доступные вкладки перед взаимодействием - это равносильно чтению ресурса bk:///context. Как: параметры не нужны. Требуется: ничего. Возвращает: serverVersion, browsers[] (каждый содержит browserId, extensionInfo, versionMismatch, когда мажорная версия расширения отличается от серверной, windows) и tabs (каждый содержит id (tabId), windowId, tabUri, url, title, active). Избегайте: повторных вызовов в плотном цикле - кэшируйте результат на время выполнения задачи.

Получает контекст браузера.

Параметры

Без параметров.

getReadableElementHtmlтолько чтениевнешний мир

Получает outerHTML одного элемента по readablePath. Когда: нужна точная разметка (атрибуты, классы, вложенная структура) одного элемента, что равнозначно чтению {tabUri}/readable-element-html/<readablePath>. Как: берёт readablePath из кортежа readable-elements (первое поле); browserId и tabId из getContext или bk:///context. Требуется: browserId, tabId, readablePath (стабильный id элемента, например f1:e1a, а не CSS-селектор). Возвращает: { snapshotId, data (HTML), hasNextPage, nextPageNumber, totalPages }. Пагинация: если hasNextPage имеет значение true, вызывает getSnapshotPage с возвращённым snapshotId, типом readable-element-html и nextPageNumber.

Получает читаемый HTML элемента

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • readablePathstringобязательный

    Стабильный id элемента (например, f1:e1a): первый элемент кортежа [path, role, text, value?] из readable-elements; не CSS-селектор

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

getReadableElementsтолько чтениевнешний мир

Получает интерактивные элементы вкладки в виде кортежей [path, role, text, value?]. Когда: нужны пути элементов для clickOnElement/fillTextToElement - эквивалентно чтению ресурса {tabUri}/readable-elements. Как: browserId и tabId из getContext или bk:///context. Требует: browserId, tabId. Возвращает: { snapshotId, data (кортежи [path, role, text, value?]), hasNextPage, nextPageNumber, totalPages }. path - стабильный идентификатор элемента (например, f1:e1a) - используется как readablePath в инструментах взаимодействия. Пагинация: если hasNextPage истинно, вызывается getSnapshotPage с возвращёнными snapshotId и nextPageNumber.

Получает читаемые элементы.

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

getReadableTextтолько чтениевнешний мир

Получает читаемый внутренний текст вкладки. Когда: вам нужно текстовое содержимое страницы — эквивалентно чтению ресурса {tabUri}/readable-text. Как: browserId и tabId из getContext или bk:///context. Требует: browserId, tabId. Возвращает: { snapshotId, data (text), hasNextPage, nextPageNumber, totalPages }. Пагинация: если hasNextPage равно true, вызовите getSnapshotPage с возвращёнными snapshotId и nextPageNumber.

Получает читаемый текст

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

getSelectionтолько чтениевнешний мир

Получает текущее выделение текста пользователя во вкладке. Когда: нужен текст, который пользователь выделил на странице. Как: browserId, windowId, tabId из bk:///context. Требуется: browserId, windowId, tabId. Возвращает: value.selectedText - пустая строка, если ничего не выбрано. Избегайте: ожидать содержимое, когда ничего не выбрано.

Получает выделение текста

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

getSnapshotPageтолько чтениевнешний мир

Получает страницу продолжения для снимка readable-text, readable-elements или readable-element-html. Когда: предыдущий вызов getReadableText, getReadableElements или getReadableElementHtml вернул hasNextPage=true. Как: используй snapshotId и nextPageNumber из предыдущего ответа. Требуется: snapshotId, type (readable-text | readable-elements | readable-element-html), pageNumber. Возвращает: ту же структуру, что и исходный вызов: { snapshotId, data, hasNextPage, nextPageNumber, totalPages }. Не вызывайте без предварительного получения страницы 1 через getReadableText, getReadableElements или getReadableElementHtml.

Получает снимок страницы

Параметры
  • pageNumberintegerобязательный

    Номер страницы для получения (из nextPageNumber в предыдущем ответе)

  • snapshotIdstringобязательный

    snapshotId, возвращенный из предыдущего вызова getReadableText или getReadableElements

  • typeenumобязательный

    Тип содержимого: readable-text, readable-elements или readable-element-html

hitEnterOnCoordinatesвнешний мир

Кликает по (x, y), затем нажимает Enter, чтобы отправить форму. Когда: резервный вариант в MV2 для отправки, если у кнопки submit нет readablePath. Как: координаты из недавнего captureTab. Требует: browserId, windowId, tabId, x, y. Возвращает: после автоожидания значение { changed, navigated, url, added, removed, tooLarge, diff? }, где diff показывает добавленные (+) и удалённые (-) readable-элементы и соседние неизменённые, с их element ids. diff отсутствует при tooLarge или navigated: перечитайте readable-elements. При ok=false: повторно захватите вкладку и пересчитайте x/y. Избегайте: на MV3; предпочитайте hitEnterOnElement, когда доступен readablePath.

Нажмите Enter по указанным координатам

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

  • xnumberобязательный

    Координата X в пикселях из последнего скриншота captureTab (только для MV2)

  • ynumberобязательный

    Y-координата в пикселях из последнего скриншота captureTab (только для MV2)

hitEnterOnElementвнешний мир

Фокусирует элемент по readablePath, затем нажимает Enter. Когда: отправка формы, если явной кнопки отправки нет. Как: readablePath из кортежа readable-elements (стабильный id элемента, например f1:e1a). Требует: browserId, windowId, tabId, readablePath. Возвращает: после авто-ожидания значение { changed, navigated, url, added, removed, tooLarge, diff? } - diff показывает добавленные (+) и удалённые (-) readable-элементы, а также соседние неизменённые, с их id элементов. Нет diff, когда tooLarge или navigated: перечитайте readable-elements. При ok=false: причина объясняет, почему (не виден, отключён, перекрыт <el>, отсоединён); перечитайте readable-elements и выберите новый id. Избегайте: использования, когда доступен readablePath кнопки отправки - вместо этого кликните по ней.

Нажмите Enter на элементе

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • readablePathstringобязательный

    Стабильный id элемента (например, f1:e1a) - первый элемент кортежа [path, role, text] из readable-elements; не CSS-селектор

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

invokeJsFnвнешний мир

Выполняет тело функции JavaScript в контексте страницы. Когда: только в MV2, и только когда инструменты для элементов/координат не могут выполнить задачу — например, установка нативного <select> (.value, затем dispatch change) или ползунок диапазона. Как: fnBodyCode — это только тело функции (без обёртки функции); используйте return, чтобы отправить значение обратно. Пример: return document.title; Требует: browserId, windowId, tabId, fnBodyCode. Возвращает: value.result = то, что вы возвращаете (должно быть сериализуемо в JSON). Избегайте: на manifestVersion 3; обёртывания в function () { ... }.

Вызывает функцию JavaScript

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • fnBodyCodestringобязательный

    Только тело функции (без обёртки функции). Пример: return document.title; Только MV2

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

openTabвнешний мир

Открывает URL в новой вкладке. Когда: переход на страницу, которая ещё не открыта. Как: browserId и windowId из bk:///context; url должен содержать схему (https://); после успеха повторно прочитайте контекст для нового tabId и дождитесь загрузки страницы. Требует: browserId, windowId, url. Возвращает: значение { browserId, windowId, tabId } — используйте возвращённые идентификаторы для последующих вызовов. Избегайте: немедленного взаимодействия — вкладке нужно время на загрузку.

Открывает вкладку

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • urlstringобязательный

    URL для открытия, включая схему (например, https://example.com)

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

savePageтолько чтениевнешний мир

Сохраняет страницу вкладки в папку загрузок пользователя одним самодостаточным файлом. Когда: нужно заархивировать страницу на будущее; работает в любом браузере и с любой версией манифеста. Как: формат "zip" (по умолчанию) пишет index.html плюс папку assets/ - меньше по размеру, а распакованную папку можно листать и искать по ней grep'ом. Формат "html" пишет один файл, встраивая ресурсы как data: URI - больше по размеру, зато открывается двойным щелчком. Требует: browserId, windowId, tabId. Необязательно: format. Возвращает: значение { filename, bytes, format, resourceCount, skipped } - в skipped перечислены ресурсы, которые не удалось встроить, с причиной для каждого. Примечание: имя файла берётся из заголовка страницы; агент не может его выбрать. Скрипты не сохраняются никогда. Шрифты, srcset и iframe не встраиваются, а кросс-доменные ресурсы без заголовков CORS попадают в skipped. Избегай: считать, что список skipped пуст - проверяй его, когда важна точность.

Сохраняет страницу на диск.

Параметры
  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • formatenum

    Формат вывода. "zip" (по умолчанию) создаёт index.html и папку assets/; "html" создаёт один файл, встраивая ресурсы в виде data: URI.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

scrollElementвнешний мир

Прокручивает содержимое внутри прокручиваемого элемента (панели, списка или любого контейнера с собственной полосой прокрутки). Когда: контент лежит в прокручиваемой области, которую scrollPage (весь вьюпорт) не сдвигает, например панель чата или длинный список внутри div. Работает на MV2 и MV3 (скриншот не нужен). Как: readablePath из кортежа readable-elements; direction принимает up/down/left/right; amount в пикселях необязателен, без него прокрутка идёт примерно на 90% размера элемента. Прокручивается элемент по readablePath, а если он сам не прокручивается - его ближайший прокручиваемый предок (так можно нацелиться на интерактивный дочерний элемент внутри панели). browserId, windowId, tabId берутся из bk:///context. Требует: browserId, windowId, tabId, readablePath, direction. Возвращает: после автоожидания значение { changed, navigated, url, added, removed, tooLarge, diff? }, где diff показывает добавленные (+) и удалённые (-) readable-элементы и соседние неизменённые, с их element id. diff отсутствует при tooLarge или navigated: перечитайте readable-elements. Если элемент уже у края или прокручиваемый контейнер не найден (прокручивать нечего), всё равно ok=true. Избегайте: использования для прокрутки всей страницы - для этого есть scrollPage; перечитывайте readable-elements после прокрутки, снимки устаревают.

Прокручивает элемент.

Параметры
  • amountinteger

    Количество пикселей для прокрутки; если не указано, по умолчанию используется примерно высота/ширина одного элемента.

  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • directionenumобязательный

    Направление прокрутки элемента

  • readablePathstringобязательный

    Стабильный id элемента (например, f1:e1a) - первый элемент кортежа [path, role, text] из readable-elements; не CSS-селектор

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

scrollPageвнешний мир

Прокручивает область просмотра страницы в заданном направлении. Когда: целевой контент или элементы за пределами экрана; показывает больше страницы перед чтением или взаимодействием. Работает в MV2 и MV3 (скриншот не нужен). Как: direction принимает значения up/down/left/right; необязательный amount в пикселях - если его не указывать, прокрутка составит примерно один экран (страницу). browserId, windowId, tabId из bk:///context. Требует: browserId, windowId, tabId, direction. Возвращает: после автоожидания значение { changed, navigated, url, added, removed, tooLarge, diff? } - diff показывает читаемые элементы, добавленные (+), удалённые (-), и соседние неизменённые, с их id элементов. Нет diff, когда tooLarge или navigated: перечитайте readable-elements. Если уже у этого края (нечего прокручивать), всё равно ok=true. Чего избегать: предполагать, что появились новые элементы - перечитайте readable-elements после прокрутки, снимки устаревают.

Прокручивает страницу

Параметры
  • amountinteger

    Количество пикселей для прокрутки; по умолчанию — примерно один вьюпорт, если не указано.

  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • directionenumобязательный

    Куда прокручивать область просмотра.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

showHumanHintидемпотентныйвнешний мир

Подсвечивает элемент и инструктирует человека действовать, когда автоматизация не удалась или шаг предназначен только для человека. Когда: CAPTCHA, 2FA, необратимые подтверждения, повторные сбои инструментов или элементы ввода MV3, которые инструменты не могут установить (нативный <select>, ползунок диапазона). Как: укажите ровно одну цель - readablePath (предпочтительно) ИЛИ x и y, но не оба сразу; действие fill требует значение. Требует: browserId, windowId, tabId, action (click | fill | hit-enter), message. Возвращает: humanMessage (передаёт дословно пользователю) и expiresInSeconds. Избегайте: одновременного указания readablePath и координат.

Показать подсказку для человека

Параметры
  • actionenumобязательный

    Ручной шаг, который должен выполнить человек.

  • browserIdstringобязательный

    Получить browserId из контекста bk:///context, обращаясь к browsers[].browserId.

  • messagestringобязательный

    Инструкция для пользователя, отображаемая во всплывающем окне браузера и в чате.

  • readablePathstring

    Стабильный id элемента из readable-elements (например, f1:e1a); укажите это ИЛИ x+y, но не оба.

  • tabIdstringобязательный

    tabId из bk:///context browsers[].tabs[].id

  • valuestring

    Требуется для заполнения — текст, который должен ввести человек.

  • windowIdstringобязательный

    windowId из bk:///context browsers[].tabs[].windowId

  • xnumber

    X координата из captureTab (MV2); укажите её вместе с y ИЛИ readablePath, но не с обоими

  • ynumber

    Координата Y из captureTab (MV2); указывайте её вместе с x ИЛИ readablePath, но не с обоими.

11.0.1основная
0.26101.14055-experimental.13
0.26100.93210-experimental.98
0.26100.91094-experimental.29
0.26093.30195-experimental.19
0.26093.30102-experimental.23
0.26092.29175-experimental.33
0.26090.92070-experimental.59
0.26073.30105-experimental.19
10.1.4
10.1.0
10.0.0
0.26071.19201-experimental.92
9.0.0
0.26063.30171-experimental.41
8.3.0
8.2.0
0.26061.14173-experimental.27
8.1.0
0.26060.99184-experimental.29
8.0.0
0.26052.22141-experimental.58
7.0.5
7.0.0
0.26032.23195-experimental.18
0.26032.23185-experimental.28
0.26032.22172-exp-28
0.26032.22104-30
6.0.0
5.0.2
5.0.1
5.0.0
4.0.0
3.0.1
3.0.0
2.0.0
1.0.9
1.0.8
1.0.7
1.0.6
1.0.3
1.0.2
1.0.1
1.0.0

Выберите клиент, чтобы установить ndthanhdev/mcp-browser-kit:

Любой клиент

Конфиг добавления MCP сервера стандартный, обычно он не меняется вообще, поэтому подходит практически к любому ИИ клиенту, поддерживающему MCP.

{
  "mcpServers": {
    "ndthanhdev-mcp-browser-kit-xfsbut3xfb": {
      "command": "npx",
      "args": [
        "@mcp-browser-kit/server@latest"
      ]
    }
  }
}
CursorCursor

Перейдите по ссылке и сервер автоматически будет добавлен в Cursor. Либо откройте/создайте файл ~/.cursor/mcp.json(%USERPROFILE%\.cursor\mcp.json на Windows) и добавьте конфиг сервера:

{
  "mcpServers": {
    "ndthanhdev-mcp-browser-kit-xfsbut3xfb": {
      "command": "npx",
      "args": [
        "@mcp-browser-kit/server@latest"
      ]
    }
  }
}
VS Code

Создайте .vscode/mcp.json в проекте (ключ верхнего уровня — servers):

{
  "servers": {
    "ndthanhdev-mcp-browser-kit-xfsbut3xfb": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "@mcp-browser-kit/server@latest"
      ]
    }
  }
}

Либо добавьте сервер через терминал:

code --add-mcp "{\"name\":\"ndthanhdev-mcp-browser-kit-xfsbut3xfb\",\"type\":\"stdio\",\"command\":\"npx\",\"args\":[\"@mcp-browser-kit/server@latest\"]}"
ClaudeClaude Desktop

Откройте Settings → Developer → Edit Config — это откроет файл claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Впишите сервер и полностью перезапустите Claude Desktop:

{
  "mcpServers": {
    "ndthanhdev-mcp-browser-kit-xfsbut3xfb": {
      "command": "npx",
      "args": [
        "@mcp-browser-kit/server@latest"
      ]
    }
  }
}
Claude CodeClaude Code

Добавьте сервер одной командой в терминале:

claude mcp add ndthanhdev-mcp-browser-kit-xfsbut3xfb -- npx @mcp-browser-kit/server@latest

Либо через JSON-конфиг:

claude mcp add-json ndthanhdev-mcp-browser-kit-xfsbut3xfb "{\"command\":\"npx\",\"args\":[\"@mcp-browser-kit/server@latest\"]}"
CodexCodex

Добавьте сервер командой в терминале:

codex mcp add ndthanhdev-mcp-browser-kit-xfsbut3xfb -- npx @mcp-browser-kit/server@latest

Либо вручную в ~/.codex/config.toml(%USERPROFILE%\.codex\config.toml на Windows):

[mcp_servers.ndthanhdev-mcp-browser-kit-xfsbut3xfb]
command = "npx"
args = ["@mcp-browser-kit/server@latest"]
PerplexityPerplexity

MCP доступен подписчикам Perplexity Pro / Max / Enterprise. Локальные серверы — только в приложении для macOS.

  1. Откройте Настройки аккаунта → Connectors.
  2. Установите вспомогательное приложение PerplexityXPC (один раз).
  3. Нажмите Add Connector → вкладка Simple.
  4. В поле Server Name укажите ndthanhdev/mcp-browser-kit, а в поле команды запуска — строку ниже:
npx @mcp-browser-kit/server@latest

Нажмите Save и дождитесь статуса Running.

WindsurfWindsurf

Откройте Windsurf Settings → Cascade → MCP Servers или отредактируйте файл ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "ndthanhdev-mcp-browser-kit-xfsbut3xfb": {
      "command": "npx",
      "args": [
        "@mcp-browser-kit/server@latest"
      ]
    }
  }
}
ClineCline

В панели Cline нажмите иконку MCP Servers → Configure → Configure MCP Servers (или отредактируйте ~/.cline/mcp.json) и добавьте сервер:

{
  "mcpServers": {
    "ndthanhdev-mcp-browser-kit-xfsbut3xfb": {
      "command": "npx",
      "args": [
        "@mcp-browser-kit/server@latest"
      ],
      "disabled": false,
      "autoApprove": []
    }
  }
}
Continue

Создайте файл в .continue/mcpServers/ (например ndthanhdev-mcp-browser-kit-xfsbut3xfb.yaml) или добавьте блок в config.yaml. MCP работает только в режиме agent:

mcpServers:
  - name: ndthanhdev-mcp-browser-kit-xfsbut3xfb
    command: npx
    args:
      - "@mcp-browser-kit/server@latest"
Zed

Выполните agent: add context server или откройте настройки (zed: open settings file) и добавьте сервер в объект context_servers:

{
  "context_servers": {
    "ndthanhdev-mcp-browser-kit-xfsbut3xfb": {
      "command": "npx",
      "args": [
        "@mcp-browser-kit/server@latest"
      ]
    }
  }
}

Похожие MCP-сервера

Browser MCP

Browser MCP

официальный

от browsermcp

Автоматизирует ваш браузер: кликает, заполняет формы, извлекает данные. Работает локально в вашем профиле, видит все логины и обходит капчи.

TypeScript⭐ 7201
apireno/DOMShell

apireno/DOMShell

от apireno

DOMShell превращает браузер в виртуальную файловую систему: AI-агенты и разработчики управляют веб-страницами через Linux-команды (ls, cd, cat, click). Упрощает автоматизацию, тестирование и веб-ск...

TypeScript⭐ 58
Browserbase MCP

Browserbase MCP

официальный

от browserbase

Запускает облачный браузер Browserbase: открывает любые сайты, кликает по элементам, заполняет формы и выгружает данные со страниц.

TypeScript⭐ 3399
Playwright MCP

Playwright MCP

официальный

от microsoft

Playwright управляет браузером: открывает страницы, кликает, заполняет формы. Работает по accessibility-дереву, без скриншотов.

TypeScript⭐ 38388
eyalzh/browser-control-mcp

eyalzh/browser-control-mcp

от eyalzh

MCP сервер для Firefox в паре с расширением дает AI управлять вкладками, историей и чтением страниц. Требует согласия на чтение - безопаснее web automation. Идеально для организации работы в браузере.

TypeScript⭐ 335
LeonTing1010/tap

LeonTing1010/tap

от leonting1010

Taprun — MCP сервер для локальной автоматизации браузера: AI компилирует детерминированный .plan.json, а сервер воспроизводит его вечно с нулевыми затратами токенов. Куки и сессии остаются в вашем ...

JavaScript⭐ 18
© Каталог MCP, 2026. Все права защищены.
Проект не аффилирован с Anthropic и любыми упомянутыми продуктами.
Все названия и торговые марки принадлежат их владельцам.
Контакты для связи: hi@mcp-katalog.ru

Лука Никитин