Browser MCP
Servidor Browser MCP para agentes de IA automatizarem páginas web com Puppeteer, ações baseadas na árvore de acessibilidade, modo de visão opcional e controle de navegador multiplataforma.
Documentação
Servidor MCP Browser Use
Um servidor Model Context Protocol (MCP) rápido e leve que capacita LLMs com automação de navegador via dados de acessibilidade estruturados do Puppeteer, com modo de visão opcional para compreensão visual complexa e configuração flexível e multiplataforma.
Principais Recursos
- ⚡ Rápido e leve. Utiliza o índice de rótulos do Puppeteer, não entrada baseada em pixels e árvore DOM de acessibilidade.
- 👁️ Suporte ao Modo de Visão. Capacidades opcionais de compreensão visual para layouts complexos e elementos visuais quando os dados estruturados não são suficientes.
- 🤖 Otimizado para LLM. Nenhum modelo de visão necessário, opera puramente em dados estruturados, menos contexto reduzindo o uso de tokens de contexto.
- 🧩 Configuração Flexível em Tempo de Execução. Personalize o tamanho do viewport, fatores do sistema de coordenadas e User-Agent em tempo de execução via cabeçalhos HTTP.
- 🌐 Multiplataforma e Extensível. Suporte para navegadores remotos e locais, uso de um mecanismo de navegador personalizado.
Requisitos
- Node.js 18 ou mais recente
- VS Code, Cursor, Windsurf, Claude Desktop ou qualquer outro cliente MCP
Primeiros passos
Local (Stdio)
Primeiro, instale o servidor Browser MCP com seu cliente. Uma configuração típica é assim:
{
"mcpServers": {
"browser": {
"command": "npx",
"args": [
"@agent-infra/mcp-server-browser@latest"
]
}
}
}
Instalar no VS Code
Você também pode instalar o servidor Browser MCP usando a CLI do VS Code:
# For VS Code
code --add-mcp '{"name":"browser","command":"npx","args":["@agent-infra/mcp-server-browser@latest"]}'
Após a instalação, o servidor Browser MCP estará disponível para uso com seu agente GitHub Copilot no VS Code.
Instalar no Cursor
Vá para Cursor Settings -> MCP -> Add new MCP Server. Dê um nome de sua preferência, use o tipo command com o comando npx @agent-infra/mcp-server-browser. Você também pode verificar a configuração ou adicionar argumentos como comando clicando em Edit.
{
"mcpServers": {
"browser": {
"command": "npx",
"args": [
"@agent-infra/mcp-server-browser@latest"
]
}
}
}
Instalar no Windsurf
Siga a documentação do Windsuff MCP. Use a seguinte configuração:
{
"mcpServers": {
"browser": {
"command": "npx",
"args": [
"@agent-infra/mcp-server-browser@latest"
]
}
}
}
Instalar no Claude Desktop
Siga o guia de instalação do MCP, use a seguinte configuração:
{
"mcpServers": {
"browser": {
"command": "npx",
"args": [
"@agent-infra/mcp-server-browser@latest"
]
}
}
}
Remoto (SSE / Streamable HTTP)
Ao mesmo tempo, use o argumento --port $your_port para iniciar o browser mcp pode ser convertido em servidor SSE e Streamable HTTP.
# normal run remote mcp server
npx @agent-infra/mcp-server-browser --port 8089
# run with DISPLAY environment for VNC or other virtual display
DISPLAY=:0 npx @agent-infra/mcp-server-browser --port 8089
Você pode usar um dos dois endpoints remotos do servidor MCP:
- Streamable HTTP (Recomendado):
http://127.0.0.1::8089/mcp - SSE:
http://127.0.0.1::8089/sse
E então na configuração do cliente MCP, defina o url para o endpoint SSE:
{
"mcpServers": {
"browser": {
"url": "http://127.0.0.1::8089/sse"
}
}
}
url para o Streamable HTTP:
{
"mcpServers": {
"browser": {
"type": "streamable-http", // If there is MCP Client support
"url": "http://127.0.0.1::8089/mcp"
}
}
}
Chamada em memória
Se o seu cliente MCP for desenvolvido com base em JavaScript / TypeScript, você pode usar diretamente chamadas em processo para evitar que seus usuários precisem instalar a interface de linha de comando para usar o Browser MCP.
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
// type: module project usage
import { createServer } from '@agent-infra/mcp-server-browser';
// commonjs project usage
// const { createServer } = await import('@agent-infra/mcp-server-browser')
const client = new Client(
{
name: 'test browser client',
version: '1.0',
},
{
capabilities: {},
},
);
const server = createServer();
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
await Promise.all([
client.connect(clientTransport),
server.connect(serverTransport),
]);
// list tools
const result = await client.listTools();
console.log(result);
// call tool
const toolResult = await client.callTool({
name: 'browser_navigate',
arguments: {
url: 'https://www.google.com',
},
});
console.log(toolResult);
Configuração
O servidor Browser MCP suporta os seguintes argumentos. Eles podem ser fornecidos na configuração JSON acima, como parte da lista "args":
> npx @agent-infra/mcp-server-browser@latest -h
-V, --version output the version number
--browser <browser> browser or chrome channel to use, possible values: chrome, edge, firefox.
--cdp-endpoint <endpoint> CDP endpoint to connect to, for example "http://127.0.0.1:9222/json/version"
--ws-endpoint <endpoint> WebSocket endpoint to connect to, for example "ws://127.0.0.1:9222/devtools/browser/{id}"
--executable-path <path> path to the browser executable.
--headless run browser in headless mode, headed by default
--host <host> host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.
--port <port> port to listen on for SSE and HTTP transport.
--proxy-bypass <bypass> comma-separated domains to bypass proxy, for example ".com,chromium.org,.domain.com"
--proxy-server <proxy> specify proxy server, for example "http://myproxy:3128" or "socks5://myproxy:8080"
--user-agent <ua string> specify user agent string
--user-data-dir <path> path to the user data directory.
--viewport-size <size> specify browser viewport size in pixels, for example "1280, 720"
--output-dir <path> path to the directory for output files
--vision Run server that uses screenshots (Aria snapshots are used by default)
-h, --help display help for command
Configuração em Tempo de Execução
O tempo de execução do navegador requer configuração para Viewport Size, Vision Model Coordinate Factors e User Agent. Eles podem ser passados através dos cabeçalhos HTTP correspondentes:
| Header | Description |
|---|---|
x-viewport-size | Tamanho do viewport do navegador, formato: width,height separado por vírgula |
x-vision-factors | Fatores do sistema de coordenadas do modelo de visão, formato: x_factor,y_factor separado por vírgula |
x-user-agent | String de User Agent, padrão é o User Agent do sistema se não especificado |
Nota: Os nomes dos cabeçalhos não diferenciam maiúsculas de minúsculas.
Exemplo:
x-viewport-size: 1920,1080
x-vision-factors: 1.0,1.0
x-user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Docker
Unificamos a implantação de VNC e MCP sob um único endpoint de URL. O Dockerfile e a imagem do DockerHub serão publicados juntos! vídeo
API
Ferramentas
| Tool Name | Description | Parameters |
|---|---|---|
browser_click | Clique em um elemento na página, antes de usar a ferramenta, use browser_get_clickable_elements para obter o índice do elemento, mas não chame browser_get_clickable_elements várias vezes | index (número, opcional): Índice do elemento para clicar |
browser_close | Feche o navegador quando a tarefa estiver concluída e o navegador não for mais necessário | |
browser_close_tab | Feche a aba atual | |
browser_evaluate | Execute JavaScript no console do navegador | script (string, obrigatório): Código JavaScript para executar, () => { /* code */ } |
browser_form_input_fill | Preencha um campo de entrada, antes de usar a ferramenta, é necessário fornecer 'index' ou 'selector' | selector (string, opcional): Seletor CSS para o campo de entrada, priorize o uso do index, se o index não for fornecido, use o selector index (número, opcional): Índice do elemento para preencher value (string, obrigatório): Valor para preencher clear (boolean, opcional): Se deve limpar o texto existente antes de preencher |
browser_get_clickable_elements | Obtenha os elementos clicáveis, hoveráveis ou selecionáveis na página atual, não chame esta ferramenta várias vezes | |
browser_get_download_list | Obtenha a lista de arquivos baixados | |
browser_get_markdown | Obtenha o conteúdo markdown da página atual | |
browser_get_text | Obtenha o conteúdo de texto da página atual | |
browser_go_back | Volte para a página anterior | |
browser_go_forward | Avance para a próxima página | |
browser_hover | Passe o mouse sobre um elemento na página, é necessário fornecer 'index' ou 'selector' | index (número, opcional): Índice do elemento para passar o mouse selector (string, opcional): Seletor CSS para o elemento para passar o mouse |
browser_navigate | Navegue para uma URL | url (string, obrigatório): |
browser_new_tab | Abra uma nova aba | url (string, obrigatório): URL para abrir na nova aba |
browser_press_key | Pressione uma tecla no teclado | key (string, obrigatório): Nome da tecla a pressionar ou um caractere a gerar, como Enter, Tab, Escape, Backspace, Delete, Insert, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, ArrowLeft, ArrowRight, ArrowUp, ArrowDown, PageUp, PageDown, Home, End, ShiftLeft, ShiftRight, ControlLeft, ControlRight, AltLeft, AltRight, MetaLeft, MetaRight, CapsLock, PrintScreen, ScrollLock, Pause, ContextMenu |
browser_read_links | Obtenha todos os links na página atual | |
browser_screenshot | Tire uma captura de tela da página atual ou de um elemento específico | name (string, opcional): Nome para a captura de tela selector (string, opcional): Seletor CSS para o elemento a capturar index (número, opcional): índice do elemento a capturar width (número, opcional): Largura em pixels (padrão: largura do viewport) height (número, opcional): Altura em pixels (padrão: altura do viewport) fullPage (boolean, opcional): Captura de tela da página inteira (padrão: false) highlight (boolean, opcional): Destacar o elemento |
browser_scroll | Role a página | amount (número, opcional): Pixels para rolar (positivo para baixo, negativo para cima), se o valor não for fornecido, role até o final da página |
browser_select | Selecione um elemento na página com índice, é necessário fornecer 'index' ou 'selector' | index (número, opcional): Índice do elemento para selecionar selector (string, opcional): Seletor CSS para o elemento a selecionar value (string, obrigatório): Valor para selecionar |
browser_switch_tab | Mude para uma aba específica | index (número, obrigatório): Índice da aba para a qual mudar |
browser_tab_list | Obtenha a lista de abas | |
browser_vision_screen_capture | Tire uma captura de tela da página atual para o modo de visão | |
browser_vision_screen_click | Clique com o botão esquerdo do mouse na página com visão e snapshot, antes de chamar esta ferramenta, você deve chamar browser_vision_screen_capture primeiro apenas uma vez, fallback para browser_click se falhar | factors (array, opcional): Fatores de escala do sistema de coordenadas do modelo de visão [width_factor, height_factor] para normalização do espaço de coordenadas. Fórmula de transformação: x = (x_model * screen_width * width_factor) / width_factor y = (y_model * screen_height * height_factor) / height_factor onde x_model, y_model são coordenadas de saída do modelo normalizadas (0-1), screen_width/height são dimensões da tela, width_factor/height_factor são fatores de quantização. Se os fatores forem desconhecidos, deixe em branco. A maioria dos modelos não requer este parâmetro. x (número, obrigatório): Coordenada X em pixels y (número, obrigatório): Coordenada Y em pixels |
Recursos
| Resource Name | URI Pattern | Description | MIME Type |
|---|---|---|---|
| Logs do console do navegador | console://logs | text/plain | |
| Downloads do navegador | download://{name} | Identificação automática baseada na extensão do arquivo | |
| Capturas de tela do navegador | screenshot://{name} | Identificação automática baseada na extensão do arquivo |
Desenvolvimento
Acesse http://127.0.0.1:6274/:
npm run dev
Entrada CLI Estendida
#!/usr/bin/env node
const {
BaseLogger,
setConfig,
addMiddleware,
} = require('@agent-infra/mcp-server-browser/request-context');
class CustomLogger extends BaseLogger {
info(...args) {
console.log('custom');
console.log(...args);
}
}
addMiddleware((req, res, next) => {
console.log('req', req.headers);
next();
});
setConfig({
logger: new CustomLogger(),
});
// start server
require('@agent-infra/mcp-server-browser/index');