feat: MCP Browser v3.0 - 42 tools with stealth mode, multi-tab, PDF, cookies, storage, network logs, device emulation

This commit is contained in:
2026-03-27 11:58:52 -03:00
parent c1d716bb84
commit 13f7392555
48 changed files with 1269 additions and 714 deletions
+12 -43
View File
@@ -1,62 +1,31 @@
const browser = require('../browser');
module.exports = async ({ data }) => {
if (!data) {
throw new Error('Data é obrigatória');
}
if (!data) throw new Error('Data é obrigatória');
await browser.start();
const p = await browser.ensurePage();
const result = await p.evaluate((formData) => {
const result = await browser.evaluateJS((formData) => {
const inputs = Array.from(document.querySelectorAll('input, textarea, select'));
let filled = [];
const filled = [];
inputs.forEach(input => {
const key = Object.keys(formData).find(k =>
(input.name && input.name.toLowerCase().includes(k.toLowerCase())) ||
(input.placeholder && input.placeholder.toLowerCase().includes(k.toLowerCase())) ||
(input.id && input.id.toLowerCase().includes(k.toLowerCase())) ||
(input.placeholder || '').toLowerCase().includes(k.toLowerCase()) ||
(input.id || '').toLowerCase().includes(k.toLowerCase()) ||
(input.getAttribute('aria-label') || '').toLowerCase().includes(k.toLowerCase())
);
if (key) {
const value = formData[key];
const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
window.HTMLInputElement.prototype, 'value'
)?.set;
const nativeTextAreaValueSetter = Object.getOwnPropertyDescriptor(
window.HTMLTextAreaElement.prototype, 'value'
)?.set;
if (input.tagName === 'INPUT' && nativeInputValueSetter) {
nativeInputValueSetter.call(input, value);
} else if (input.tagName === 'TEXTAREA' && nativeTextAreaValueSetter) {
nativeTextAreaValueSetter.call(input, value);
} else {
input.value = value;
}
const nativeSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set;
const nativeTextAreaSetter = Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype, 'value')?.set;
if (input.tagName === 'INPUT' && nativeSetter) nativeSetter.call(input, value);
else if (input.tagName === 'TEXTAREA' && nativeTextAreaSetter) nativeTextAreaSetter.call(input, value);
else input.value = value;
input.dispatchEvent(new Event('input', { bubbles: true }));
input.dispatchEvent(new Event('change', { bubbles: true }));
filled.push({
field: input.name || input.id || input.placeholder || 'unknown',
value: value
});
filled.push({ field: input.name || input.id || input.placeholder || 'unknown', value });
}
});
return filled;
}, data);
return {
success: true,
action: "fill_form_auto",
filled: result,
count: result.length
};
return { success: true, action: 'fill_form_auto', filled: result, count: result.length };
};