108 lines
5.1 KiB
JavaScript
108 lines
5.1 KiB
JavaScript
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
|
|
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
|
|
const {
|
|
ListToolsRequestSchema,
|
|
CallToolRequestSchema
|
|
} = require('@modelcontextprotocol/sdk/types.js');
|
|
|
|
// TOOLS
|
|
const openUrl = require('./tools/openUrl');
|
|
const click = require('./tools/click');
|
|
const type = require('./tools/type');
|
|
const screenshot = require('./tools/screenshot');
|
|
const getText = require('./tools/getText');
|
|
const getLinks = require('./tools/getLinks');
|
|
const waitForSelector = require('./tools/waitForSelector');
|
|
const extractElements = require('./tools/extractElements');
|
|
const smartClick = require('./tools/smartClick');
|
|
const smartType = require('./tools/smartType');
|
|
const getButtons = require('./tools/getButtons');
|
|
const smartWaitNavigation = require('./tools/smartWaitNavigation');
|
|
const getForms = require('./tools/getForms');
|
|
const fillFormAuto = require('./tools/fillFormAuto');
|
|
const agentFlow = require('./tools/agentFlow');
|
|
const agentFlowV2 = require('./tools/agentFlowV2');
|
|
const closeBrowser = require('./tools/closeBrowser');
|
|
|
|
// SERVER MCP
|
|
const server = new Server(
|
|
{
|
|
name: "browser",
|
|
version: "2.0.0"
|
|
},
|
|
{
|
|
capabilities: {
|
|
tools: {}
|
|
}
|
|
}
|
|
);
|
|
|
|
// LISTAR TOOLS
|
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
return {
|
|
tools: [
|
|
{ name: "open_url", description: "Abre uma URL", inputSchema: { type: "object", properties: { url: { type: "string" } }, required: ["url"] } },
|
|
{ name: "click", description: "Clica por seletor", inputSchema: { type: "object", properties: { selector: { type: "string" } }, required: ["selector"] } },
|
|
{ name: "type", description: "Digita texto", inputSchema: { type: "object", properties: { selector: { type: "string" }, text: { type: "string" } }, required: ["selector", "text"] } },
|
|
{ name: "screenshot", description: "Screenshot", inputSchema: { type: "object", properties: { fullPage: { type: "boolean" } } } },
|
|
{ name: "get_text", description: "Extrai texto", inputSchema: { type: "object", properties: { selector: { type: "string" } } } },
|
|
{ name: "get_links", description: "Lista links", inputSchema: { type: "object", properties: { selector: { type: "string" } } } },
|
|
{ name: "wait_for_selector", description: "Espera elemento", inputSchema: { type: "object", properties: { selector: { type: "string" }, timeout: { type: "number" } }, required: ["selector"] } },
|
|
{ name: "extract_elements", description: "Extrai elementos", inputSchema: { type: "object", properties: { selector: { type: "string" }, attributes: { type: "array", items: { type: "string" } } }, required: ["selector"] } },
|
|
{ name: "smart_click", description: "Clica por texto visível", inputSchema: { type: "object", properties: { text: { type: "string" } }, required: ["text"] } },
|
|
{ name: "smart_type", description: "Digita por label/placeholder", inputSchema: { type: "object", properties: { label: { type: "string" }, text: { type: "string" } }, required: ["label", "text"] } },
|
|
{ name: "get_buttons", description: "Lista botões disponíveis", inputSchema: { type: "object", properties: {} } },
|
|
{ name: "smart_wait_navigation", description: "Espera mudança de página", inputSchema: { type: "object", properties: { timeout: { type: "number" } } } },
|
|
{ name: "get_forms", description: "Lista formulários da página", inputSchema: { type: "object", properties: {} } },
|
|
{ name: "fill_form_auto", description: "Preenche formulário automaticamente", inputSchema: { type: "object", properties: { data: { type: "object" } }, required: ["data"] } },
|
|
{ name: "agent_flow", description: "Fluxo automático simples", inputSchema: { type: "object", properties: { goal: { type: "string" }, data: { type: "object" } }, required: ["goal"] } },
|
|
{ name: "agent_flow_v2", description: "Fluxo automático avançado com retry e fallback", inputSchema: { type: "object", properties: { goal: { type: "string" }, data: { type: "object" }, retries: { type: "number" } }, required: ["goal"] } },
|
|
{ name: "close_browser", description: "Fecha o navegador", inputSchema: { type: "object", properties: {} } }
|
|
]
|
|
};
|
|
});
|
|
|
|
// EXECUTAR TOOL
|
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
const { name, arguments: args } = request.params;
|
|
|
|
const tools = {
|
|
open_url: openUrl,
|
|
click,
|
|
type,
|
|
screenshot,
|
|
get_text: getText,
|
|
get_links: getLinks,
|
|
wait_for_selector: waitForSelector,
|
|
extract_elements: extractElements,
|
|
smart_click: smartClick,
|
|
smart_type: smartType,
|
|
get_buttons: getButtons,
|
|
smart_wait_navigation: smartWaitNavigation,
|
|
get_forms: getForms,
|
|
fill_form_auto: fillFormAuto,
|
|
agent_flow: agentFlow,
|
|
agent_flow_v2: agentFlowV2,
|
|
close_browser: closeBrowser
|
|
};
|
|
|
|
if (!tools[name]) {
|
|
throw new Error("Tool não encontrada");
|
|
}
|
|
|
|
const result = await tools[name](args || {});
|
|
|
|
return {
|
|
content: [
|
|
{
|
|
type: "text",
|
|
text: JSON.stringify(result)
|
|
}
|
|
]
|
|
};
|
|
});
|
|
|
|
// START SERVER
|
|
const transport = new StdioServerTransport();
|
|
server.connect(transport); |