
Security News
AI Agent Lands PRs in Major OSS Projects, Targets Maintainers via Cold Outreach
An AI agent is merging PRs into major OSS projects and cold-emailing maintainers to drum up more work.
web-parser-mcp
Advanced tools
🚀 MCP SERVER FIXED v3.7.9! Resolved import errors, middleware conflicts, type hints - NOW WORKING PERFECTLY!
РЕВОЛЮЦИОННАЯ АРХИТЕКТУРА! 🚀 ОДИН браузерный контекст для ВСЕХ инструментов! Автоматическое разделение сессии! Идеальное управление авторизацией!
login_response, response.urllogin_result.get()src/tools/auth.pyget_http_client() вызывался без awaitawait для асинхронного вызоваsrc/tools/api_test.pyUnifiedHTTPClientsrc/tools/navigation.pyexcept: без спецификации исключений скрывает ошибкиsrc/utils/audit.pyParallelBrowserManager мог зависнуть навсегдаsrc/utils/http_client.py✅ auth.py imports OK
✅ api_client OK
✅ http_client OK
🎯 All critical fixes verified!
🎯 ГОТОВ К ПРОДАКШЕНУ! Полная DevOps инфраструктура, мониторинг, CI/CD и документация!
// Раньше: Сложная синхронизация между requests и Playwright
browser_login() → сохраняет куки в authenticated_session
fetch_html() → вручную переносит куки в requests.Session
parse_page() → вручную переносит куки в requests.Session
// Теперь: Единый браузерный контекст для всех инструментов
browser_login() → логинится в unified browser session
fetch_html() → использует тот же browser session
parse_page() → использует тот же browser session
parallel_fetch() → использует тот же browser session
fetch_html - теперь использует UnifiedHTTPClient (Playwright only)parallel_fetch - обновлен для использования unified browser sessionbrowser_login - использует unified session + нет cleanupauto_paginate - использует unified browser contextinfinite_scroll - использует unified browser contextdebug_screenshot - использует unified browser context// 1. Логин один раз
{
"tool": "browser_login",
"arguments": {
"url": "https://site.com/login",
"username": "user@email.com",
"password": "password"
}
}
// 2. ВСЕ инструменты автоматически используют сессию!
{
"tool": "fetch_html",
"arguments": {"url": "https://site.com/protected"}
}
// ✅ session_used: {"source": "unified_browser_session", "cookies_count": 15}
{
"tool": "parallel_fetch",
"arguments": {"urls": ["https://site.com/page1", "https://site.com/page2"]}
}
// ✅ Оба запроса используют авторизацию автоматически!
{
"tool": "auto_paginate",
"arguments": {"url": "https://site.com/data", "max_pages": 5}
}
// ✅ Весь процесс пагинации использует авторизацию!
Теперь авторизация работает идеально для ВСЕХ инструментов! 🎉
domcontentloaded + networkidle + JavaScript delaywait_for="#content" для ожидания конкретных элементов// Раньше: Простая загрузка
{
"tool": "fetch_html",
"arguments": {
"url": "https://spa-site.com"
}
}
// ❌ Мог не загрузить динамический контент
// Теперь: Enhanced loading с полным контролем
{
"tool": "fetch_html",
"arguments": {
"url": "https://spa-site.com",
"wait_for": "#main-content",
"stealth": true,
"debug": true
}
}
// ✅ Полный контент + performance метрики + диагностика
domcontentloaded - базовая загрузка DOMselector waiting - ожидание конкретного элемента (если указан wait_for)networkidle - ожидание пока сеть успокоитсяjavascript_delay - дополнительное время для JS выполнения{
"tool": "fetch_html",
"arguments": {
"url": "https://protected-site.com",
"stealth": true
}
}
Включает:
navigator.webdriver{
"method": "playwright_enhanced",
"wait_strategies_used": ["domcontentloaded", "selector:#content", "networkidle", "javascript_delay"],
"performance": {
"dom_content_loaded": 245.5,
"load_complete": 1250.8,
"total_time": 1456.3
},
"page_title": "Dynamic SPA Page",
"final_url": "https://spa-site.com/redirected"
}
Теперь fetch_html получает ПОЛНЫЙ контент современных веб-приложений! 🚀
extract_links_tool - теперь использует UnifiedHTTPClient (был requests)parse_page_tool - теперь использует UnifiedHTTPClient (был requests)download_media_tool - гибридный подход: UnifiedHTTPClient для HTML + aiohttp для файловlogin_form_tool - теперь использует UnifiedHTTPClient (был requests)// Раньше: Разные API для разных инструментов
extract_links() → session.get() // requests API
parse_page() → session.get() // requests API
download_media() → session.get() // requests API
login_form() → session.post() // requests API
// Теперь: Единый UnifiedHTTPClient для всех
extract_links() → http_client.get() // Playwright browser
parse_page() → http_client.get() // Playwright browser
download_media() → http_client.get() // Playwright browser
login_form() → http_client.post() // Playwright browser
Теперь ВСЕ HTTP-инструменты используют Playwright через UnifiedHTTPClient! 🎉
fetch_html - UnifiedHTTPClient (Playwright enhanced)extract_links_tool - UnifiedHTTPClient (Playwright)parse_page_tool - UnifiedHTTPClient (Playwright)download_media_tool - UnifiedHTTPClient (HTML) + aiohttp (files)login_form_tool - UnifiedHTTPClient (Playwright)extract_structured_data_tool - UnifiedHTTPClient (Playwright)// Раньше: Смешанные API
fetch_html() → requests.Session + Playwright (hybrid)
extract_links() → requests.Session
parse_page() → requests.Session
login_form() → requests.Session
download_media() → requests.Session
extract_structured_data() → requests.Session
// Теперь: 100% Unified Playwright
fetch_html() → http_client.get() // Playwright enhanced
extract_links() → http_client.get() // Playwright
parse_page() → http_client.get() // Playwright
login_form() → http_client.post() // Playwright
download_media() → http_client.get() // Playwright + aiohttp
extract_structured_data() → http_client.get() // Playwright
🎉 ВСЕ ИНСТРУМЕНТЫ ТЕПЕРЬ ИСПОЛЬЗУЮТ PLAYWRIGHT ЧЕРЕЗ UNIFIEDHTTPCLIENT!
Больше НЕТ requests API в инструментах! 🚀
// Раньше: Прямые HTTP запросы
page.goto(url) // API вызов
page.content() // Чтение HTML
// Теперь: Имитация человека
await keyboard.type(url, {delay: 50}) // Набор текста
await keyboard.press('Enter') // Нажатие Enter
await page.mouse.wheel(0, 300) // Прокрутка
await page.mouse.move(x, y, {steps: 20}) // Движение мыши
// parallel_fetch теперь использует:
Browser Pool (до 5 браузеров)
├── Browser 1 → URL 1 (human navigation)
├── Browser 2 → URL 2 (human navigation)
├── Browser 3 → URL 3 (human navigation)
└── Browser 4 → URL 4 (human navigation)
Теперь инструменты ведут себя как настоящий пользователь! 🎭
// Раньше: Чистый Playwright (медленный для больших объемов)
page.goto(url) → ожидание загрузки → чтение HTML
// Теперь: Гибридный подход
1. browser_login() → создает браузерную сессию с куками
2. fetch_html() → использует SessionAPIClient с браузерными куками
3. Все инструменты → автоматически используют session cookies
// 1. Логин в браузере
browser_login(url, username, password)
// ✅ Создает браузерную сессию с куками
// 2. Автоматическое обновление API клиента
api_client.update_from_browser_session()
// ✅ Копирует куки из браузера в requests.Session
// 3. Все последующие запросы используют куки
api_client.get("https://protected-site.com/api/data")
// ✅ Автоматически отправляет session cookies
# SessionAPIClient - эффективный requests клиент с браузерными куками
class SessionAPIClient:
def update_from_browser_session(self):
"""Копирует куки из браузерной сессии в requests.Session"""
def get(self, url, headers=None, params=None):
"""GET запрос с session куками"""
def post(self, url, data=None, json_data=None):
"""POST запрос с session куками"""
// 1. Один раз логинимся в браузере
{
"tool": "browser_login",
"arguments": {
"url": "https://site.com/login",
"username": "user",
"password": "pass"
}
}
// 2. Все инструменты автоматически используют session cookies
{
"tool": "fetch_html",
"arguments": {"url": "https://site.com/protected"}
}
// ✅ Использует browser session cookies
{
"tool": "extract_links_tool",
"arguments": {"url": "https://site.com/data"}
}
// ✅ Автоматически аутентифицирован
{
"tool": "parallel_fetch",
"arguments": {"urls": ["url1", "url2", "url3"]}
}
// ✅ Все запросы с session cookies
🎉 Теперь у вас БЫСТРЫЕ API запросы + НАДЕЖНАЯ браузерная аутентификация!
pyproject.toml: v3.7.6 ✅main.py: обновлен до актуальной архитектуры ✅ensure_session_updated() в SessionAPIClientupdate_from_browser_session()session из media.pyrotate_user_agent() и get_security_info()api_client = get_api_client()
# Ротация User-Agent
api_client.rotate_user_agent()
# Информация о безопасности
security_info = api_client.get_security_info()
# {
# "user_agent": "Mozilla/5.0...",
# "cookies_count": 15,
# "session_updated": true,
# "headers_count": 12,
# "has_browser_session": true
# }
🔧 SessionAPIClient (v3.7.6)
├── ✅ Rotating User-Agent
├── ✅ Auto session updates
├── ✅ Security headers
├── ✅ Browser cookie sync
└── ✅ Unified tool interface
📊 Все инструменты:
├── fetch_html → SessionAPIClient ✅
├── extract_links_tool → SessionAPIClient ✅
├── parse_page_tool → SessionAPIClient ✅
├── download_media_tool → SessionAPIClient ✅
├── extract_structured_data → SessionAPIClient ✅
└── debug_screenshot_tool → UnifiedHTTPClient ✅
🔧 КРИТИЧЕСКИЕ ПРОБЛЕМЫ ИСПРАВЛЕНЫ! АРХИТЕКТУРА УНИФИЦИРОВАНА!
📁 src/tools/definitions/
├── 🔍 fetch_tools.py # 4 инструмента: HTML fetching и basic extraction
├── 🔐 auth_tools.py # 2 инструмента: Form и browser authentication
├── 📊 session_tools.py # 5 инструментов: Session management и auth setup
├── 🧭 navigation_tools.py # 3 инструмента: Pagination и parallel processing
├── 🎬 media_tools.py # 2 инструмента: Screenshots и media download
└── 📋 data_tools.py # 3 инструмента: Structured data processing
// 1. Логинимся через browser_login
{
"tool": "browser_login",
"arguments": {
"url": "https://site.com/login",
"username": "user@email.com",
"password": "password"
}
}
// ✅ Результат: session сохраняется глобально
{
"success": true,
"progress_steps": [...],
"cookies_imported": 15,
"session_saved": "Tools can now use 15 cookies"
}
// 2. Теперь fetch_html АВТОМАТИЧЕСКИ использует куки!
{
"tool": "fetch_html",
"arguments": {
"url": "https://site.com/protected-page"
// 🔥 НЕ НУЖНО указывать куки - они уже есть!
}
}
// ✅ Результат: получаем защищенный контент
{
"html": "...protected content...",
"authenticated_session_used": true,
"cookies_from_login": 15
}
// 3. Очищаем сессию когда нужно
{
"tool": "clear_session",
"arguments": {
"clear_cache": true
}
}
// ✅ Результат: полная очистка
{
"status": "completed",
"cleared_items": [
"Authenticated session for https://site.com/login",
"Session cookies (15 items)",
"Memory cache (5 items)"
]
}
{
"tool": "browser_login",
"arguments": {
"url": "https://stepik.org/login",
"username": "your@email.com",
"password": "yourpassword",
"headless": true
}
}
Результат:
{
"success": true,
"automatic_login": true,
"form_filled": true,
"button_clicked": true,
"progress_steps": [
{"step": "Initializing browser", "status": "completed"},
{"step": "Page loaded", "status": "completed"},
{"step": "Form fields detected", "status": "completed"},
{"step": "Username filled", "status": "completed"},
{"step": "Password filled", "status": "completed"},
{"step": "Login button clicked", "status": "completed"},
{"step": "Login completed successfully", "status": "completed"}
]
}
// БЫЛО: Быстрая загрузка
await page.wait_for_load_state('domcontentloaded')
// СТАЛО: Полное ожидание формы
await page.wait_for_load_state('domcontentloaded')
await asyncio.sleep(3) // Ожидание JS рендеринга
await page.wait_for_load_state('networkidle', timeout=15000)
// БЫЛО: 8 базовых селекторов
username_candidates = [
"input[type='email']",
"input[name*='user']",
"input[type='text']:first-of-type"
]
// СТАЛО: 20+ продвинутых селекторов
username_candidates = [
"input[type='email']",
"input[name*='email' i]",
"input[name*='user' i]",
"input[name*='login' i]",
"input[placeholder*='email' i]",
"input[autocomplete='email']",
"[data-testid*='username']",
"[data-test*='email']",
"input:not([type='password']):not([type='hidden'])",
// ... и еще 10+ вариантов
]
// БЫЛО: Быстрое заполнение
await element.fill(username)
// СТАЛО: Реалистичное взаимодействие
await page.wait_for_selector(selector, state="visible", timeout=10000)
await element.click() // Фокус поля
await asyncio.sleep(0.5) // Пауза перед вводом
await element.fill("") // Очистка поля
await element.type(username, delay=50) // Медленный ввод
input[type="email"] + input[type="password"]data-testid, data-test атрибуты{
"tool": "browser_login",
"arguments": {
"url": "https://site.com/login",
"username": "your@email.com",
"password": "yourpassword",
"headless": false,
"verbose": true
}
}
**Результат:**
```json
{
"success": true,
"automatic_login": true,
"form_filled": true,
"button_clicked": true,
"progress_steps": [
{"step": "Initializing browser", "status": "completed"},
{"step": "Waiting for form elements to load", "status": "completed"},
{"step": "Auto-detecting username field", "status": "completed", "details": "input[name='email']"},
{"step": "Username filled", "status": "completed"},
{"step": "Password filled", "status": "completed"},
{"step": "Login button clicked", "status": "completed"},
{"step": "Login completed successfully", "status": "completed"}
]
}
Теперь browser_login работает стабильно на большинстве сайтов! 🎉
Обновлено v3.6.1 - browser_login теперь работает правильно!
npm install -g web-parser-mcp
git clone <repository-url>
cd web-parser-mcp
# Если у вас установлен uv (рекомендуется)
uv sync
# Или использовать pip
pip install -r requirements.txt
npx web-parser-mcp
# С uv
uv run main.py
# Или с обычным Python
python main.py
Добавьте в конфигурацию вашего MCP клиента:
{
"mcpServers": {
"web-parser": {
"command": "npx",
"args": ["web-parser-mcp"]
}
}
}
Или для локального использования:
{
"mcpServers": {
"web-parser": {
"command": "uv",
"args": ["run", "/path/to/web-parser-mcp/main.py"]
}
}
}
Получает HTML контент с автоматическим выбором метода парсинга.
Параметры:
url (обязательный): URL веб-страницыtimeout (опционально): Таймаут запроса в секундах (по умолчанию: 10)headers (опционально): Пользовательские заголовки HTTPuse_browser (опционально): Принудительно использовать Playwright (по умолчанию: false)wait_for (опционально): CSS селектор для ожидания загрузкиimport_cookies_from (опционально): Импорт cookies из браузера ('chrome', 'firefox', 'edge', 'safari')anti_detection (опционально): Включить антидетекцию (по умолчанию: false)debug (опционально): Подробные логи (по умолчанию: false)stealth (опционально): Stealth режим (по умолчанию: false)Примеры использования:
Простой сайт (автоматически использует requests):
{
"tool": "fetch_html",
"arguments": {
"url": "https://example.com"
}
}
JavaScript SPA (автоматически определяет и использует Playwright):
{
"tool": "fetch_html",
"arguments": {
"url": "https://react-app.com/dashboard",
"wait_for": "#content",
"debug": true
}
}
Сложный сайт с anti-detection:
{
"tool": "fetch_html",
"arguments": {
"url": "https://protected-site.com",
"use_browser": true,
"stealth": true,
"anti_detection": true,
"import_cookies_from": "chrome"
}
}
Извлекает чистый текст из HTML контента.
Параметры:
html (обязательный): HTML контент для обработкиpreserve_formatting (опционально): Сохранять форматирование (по умолчанию: false)Пример использования:
{
"tool": "extract_text",
"arguments": {
"html": "<div><p>Hello <strong>World</strong></p></div>",
"preserve_formatting": true
}
}
Находит HTML элементы по CSS селекторам.
Параметры:
html (обязательный): HTML контент для поискаselector (обязательный): CSS селектор (например: "div.class", "#id", "a[href]")attribute (опционально): Конкретный атрибут для извлеченияlimit (опционально): Максимальное количество элементов (по умолчанию: 10)Пример использования:
{
"tool": "find_elements",
"arguments": {
"html": "<div><a href='http://example.com'>Link</a></div>",
"selector": "a[href]",
"attribute": "href",
"limit": 5
}
}
Извлекает и фильтрует ссылки с расширенными возможностями. Идеален для получения списка страниц для дальнейшего обхода.
Параметры:
url (опционально): URL веб-страницы для извлечения ссылокhtml (опционально): HTML контент для извлечения ссылокbase_url (опционально): Базовый URL для разрешения относительных ссылокinternal_only (опционально): Только внутренние ссылки (тот же домен)external_only (опционально): Только внешние ссылки (другие домены)url_pattern (опционально): Regex паттерн для фильтрации URLtext_pattern (опционально): Regex паттерн для фильтрации текста ссылокexclude_fragments (опционально): Исключить фрагменты (#section) (по умолчанию: true)unique_only (опционально): Только уникальные URL (по умолчанию: true)limit (опционально): Максимальное количество ссылок (по умолчанию: 100)Примеры использования:
Получить все внутренние ссылки с сайта:
{
"tool": "extract_links",
"arguments": {
"url": "https://example.com",
"internal_only": true,
"limit": 50
}
}
Найти ссылки на статьи (по паттерну URL):
{
"tool": "extract_links",
"arguments": {
"url": "https://blog.example.com",
"url_pattern": "/article/",
"internal_only": true
}
}
Получить пагинацию (ссылки "Далее", "Next"):
{
"tool": "extract_links",
"arguments": {
"url": "https://example.com/posts",
"text_pattern": "(Next|Далее|>)",
"internal_only": true
}
}
Выполняет авторизацию через веб-формы и сохраняет сессию для последующих запросов.
Параметры:
login_url (обязательный): URL страницы с формой логинаusername (обязательный): Имя пользователя или emailpassword (обязательный): Парольusername_field (опционально): Имя поля для username (автоопределение)password_field (опционально): Имя поля для password (автоопределение)additional_fields (опционально): Дополнительные поля формы (CSRF токены и т.д.)submit_url (опционально): URL для отправки формы (автоопределение)Пример использования:
{
"tool": "login_form",
"arguments": {
"login_url": "https://example.com/login",
"username": "myuser@example.com",
"password": "mypassword",
"additional_fields": {
"_token": "csrf_token_value"
}
}
}
Устанавливает HTTP Basic Authentication для всех последующих запросов.
Параметры:
username (обязательный): Имя пользователяpassword (обязательный): ПарольПример использования:
{
"tool": "set_basic_auth",
"arguments": {
"username": "api_user",
"password": "api_password"
}
}
Импортирует cookies из браузера для аутентификации без повторного логина.
Параметры:
browser (обязательный): Браузер для импорта ('chrome', 'firefox', 'edge', 'safari')domain (опционально): Домен для импорта cookies (по умолчанию: все)Примеры использования:
Импорт всех cookies из Chrome:
{
"tool": "import_browser_cookies",
"arguments": {
"browser": "chrome"
}
}
Импорт cookies для конкретного сайта:
{
"tool": "import_browser_cookies",
"arguments": {
"browser": "chrome",
"domain": "example.com"
}
}
Получает информацию о текущей сессии, включая cookies и статус аутентификации.
Пример использования:
{
"tool": "get_session_info",
"arguments": {}
}
Очищает все данные сессии, включая cookies и аутентификацию.
Пример использования:
{
"tool": "clear_session",
"arguments": {}
}
Комплексный парсинг веб-страницы с извлечением структурированных данных.
Параметры:
url (обязательный): URL веб-страницыextract_title (опционально): Извлечь заголовок страницы (по умолчанию: true)extract_meta (опционально): Извлечь мета-теги (по умолчанию: true)extract_links (опционально): Извлечь все ссылки (по умолчанию: false)extract_images (опционально): Извлечь все изображения (по умолчанию: false)custom_selectors (опционально): Пользовательские CSS селекторыПример использования:
{
"tool": "parse_page",
"arguments": {
"url": "https://news.ycombinator.com",
"extract_links": true,
"extract_images": true,
"custom_selectors": {
"headlines": ".titleline > a",
"scores": ".score"
}
}
}
{
"tool": "login_form",
"arguments": {
"login_url": "https://site.com/login",
"username": "user@example.com",
"password": "password123"
}
}
{
"tool": "get_session_info",
"arguments": {}
}
{
"tool": "fetch_html",
"arguments": {
"url": "https://site.com/private-area"
}
}
{
"tool": "clear_session",
"arguments": {}
}
{
"tool": "set_basic_auth",
"arguments": {
"username": "api_user",
"password": "api_key"
}
}
После этого все запросы будут использовать Basic Authentication.
{
"tool": "fetch_html",
"arguments": {
"url": "https://admin.modern-spa.com",
"wait_for": "#dashboard-content",
"debug": true
}
}
{
"tool": "extract_links",
"arguments": {
"url": "https://admin.modern-spa.com",
"use_browser": true,
"internal_only": true
}
}
{
"tool": "import_browser_cookies",
"arguments": {
"browser": "chrome",
"domain": "secure-site.com"
}
}
{
"tool": "fetch_html",
"arguments": {
"url": "https://secure-site.com/private-data"
}
}
{
"tool": "fetch_html",
"arguments": {
"url": "https://protected-site.com/data",
"use_browser": true,
"stealth": true,
"anti_detection": true,
"wait_for": ".content-loaded",
"debug": true
}
}
{
"tool": "fetch_html",
"arguments": {
"url": "https://example.com",
"use_browser": false
}
}
{
"tool": "parse_page",
"arguments": {
"url": "https://example.com/dynamic",
"use_browser": true,
"extract_links": true,
"wait_for": "#content"
}
}
Система автоматически определяет тип сайта и выбирает оптимальный метод:
Playwright автоматически используется для:
wait_for или stealthRequests используется для:
{
"tool": "set_oauth_token",
"arguments": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"provider": "google"
}
}
{
"tool": "browser_login",
"arguments": {
"url": "https://complex-auth-site.com/login",
"headless": false,
"wait_for_user": true,
"timeout": 300,
"success_indicator": "#dashboard"
}
}
{
"tool": "auto_paginate",
"arguments": {
"url": "https://news-site.com/articles",
"max_pages": 10,
"wait_between": 2,
"extract_data": {
"titles": "h2.article-title",
"links": "a.read-more",
"dates": ".article-date"
}
}
}
{
"tool": "parallel_fetch",
"arguments": {
"urls": [
"https://site1.com/page1",
"https://site2.com/page2",
"https://site3.com/page3"
],
"max_workers": 5,
"extract_data": {
"titles": "h1",
"prices": ".price"
}
}
}
{
"tool": "debug_screenshot",
"arguments": {
"url": "https://complex-page.com",
"path": "debug_complex_page.png",
"full_page": true,
"wait_for": "#content-loaded"
}
}
{
"tool": "import_browser_cookies",
"arguments": {
"browser": "chrome",
"domain": "secured-site.com"
}
}
{
"tool": "parallel_fetch",
"arguments": {
"urls": ["https://secured-site.com/page1", "https://secured-site.com/page2"],
"use_browser": true,
"max_workers": 3
}
}
{
"tool": "auto_paginate",
"arguments": {
"url": "https://secured-site.com/data",
"max_pages": 5,
"extract_data": {
"records": ".data-record",
"values": ".field-value"
}
}
}
{
"tool": "infinite_scroll",
"arguments": {
"url": "https://social-feed.com",
"trigger_selector": ".load-more-btn",
"max_scrolls": 20,
"scroll_pause_time": 3,
"extract_data": {
"posts": ".post-content",
"authors": ".post-author",
"likes": ".like-count"
},
"stop_condition": ".end-of-feed"
}
}
{
"tool": "extract_structured_data",
"arguments": {
"url": "https://shop.com/product/123",
"schema": "product",
"output_format": "json"
}
}
Пользовательская схема для курсов:
{
"tool": "extract_structured_data",
"arguments": {
"url": "https://learning-platform.com/course/python",
"schema": "custom",
"custom_schema": {
"title": ["h1.course-title", ".main-title"],
"instructor": [".teacher-name", ".instructor"],
"price": [".price", ".cost"],
"duration": [".length", ".duration"],
"students": [".enrollment-count", ".students"]
},
"output_format": "table"
}
}
// Сначала проверяем кэш
{
"tool": "cache_results",
"arguments": {
"action": "get",
"key": "product_data_123"
}
}
// Если нет в кэше - загружаем и кэшируем
{
"tool": "cache_results",
"arguments": {
"action": "set",
"key": "product_data_123",
"value": "fetched_product_data",
"duration": "1h"
}
}
// Статистика кэша
{
"tool": "cache_results",
"arguments": {
"action": "stats"
}
}
{
"tool": "download_media",
"arguments": {
"url": "https://gallery.com/photos",
"types": ["images", "videos"],
"download_path": "./media_files/",
"max_files": 100,
"min_size": 10,
"max_size": 50
}
}
Скачивание документов:
{
"tool": "download_media",
"arguments": {
"url": "https://research-site.com/papers",
"types": ["pdfs", "documents"],
"download_path": "./research_papers/",
"max_files": 20,
"min_size": 100,
"max_size": 10
}
}
{
"tool": "import_browser_cookies",
"arguments": {
"browser": "chrome",
"domain": "enterprise-platform.com"
}
}
{
"tool": "infinite_scroll",
"arguments": {
"url": "https://enterprise-platform.com/data-feed",
"max_scrolls": 50,
"extract_data": {
"records": ".data-record",
"timestamps": ".record-time",
"values": ".metric-value"
}
}
}
{
"tool": "extract_structured_data",
"arguments": {
"url": "https://enterprise-platform.com/analytics",
"schema": "custom",
"custom_schema": {
"metrics": [".metric", ".kpi"],
"trends": [".trend-data", ".chart-data"],
"alerts": [".alert", ".warning"]
}
}
}
{
"tool": "parallel_fetch",
"arguments": {
"urls": ["https://enterprise-platform.com/dept1", "https://enterprise-platform.com/dept2"],
"max_workers": 5,
"extract_data": {
"department_data": ".dept-metrics",
"staff_count": ".staff-counter"
}
}
}
{
"tool": "download_media",
"arguments": {
"url": "https://enterprise-platform.com/reports",
"types": ["pdfs", "documents"],
"download_path": "./enterprise_reports/"
}
}
{
"tool": "debug_screenshot",
"arguments": {
"url": "https://enterprise-platform.com/dashboard",
"path": "./debug/enterprise_dashboard.png",
"full_page": true
}
}
{
"tool": "browser_login",
"arguments": {
"url": "https://stepik.org/login",
"headless": false,
"success_indicator": ".navbar-profile",
"verbose": true,
"auto_screenshot_on_error": true
}
}
Получите детальный анализ:
{
"success": false,
"diagnostics": {
"error_details": "CAPTCHA detected on page with selector: .g-recaptcha",
"protection_detected": "CAPTCHA",
"browser_logs": [
"[console] Loading reCAPTCHA...",
"[ERROR] Failed to verify reCAPTCHA"
],
"final_screenshot": "./debug/browser_login_1703123456.png",
"login_errors": ["Invalid credentials"],
"response_status": 200
},
"recommendations": [
"Manual CAPTCHA solving required. Use headless=false for user interaction.",
"Consider using anti-captcha services for automation."
]
}
{
"tool": "login_form",
"arguments": {
"login_url": "https://stepik.org/login",
"username": "test@example.com",
"password": "password123",
"verbose": true
}
}
Получите полный анализ:
{
"status_code": 403,
"likely_success": false,
"success_score": "2/12",
"failure_score": "4/7",
"response_time_seconds": 1.2,
"diagnostics": {
"error_details": "403 Forbidden - Bot detection active",
"protection_detected": "Bot Detection",
"response_protection": "Bot Detection",
"login_errors": ["Too many login attempts"],
"redirect_chain": [
{"url": "https://stepik.org/login", "status": 200, "final_url": "https://stepik.org/login"},
{"url": "https://stepik.org/api/auth", "status": 403, "final_url": "https://stepik.org/blocked"}
],
"form_analysis": {
"action": "/api/auth",
"method": "POST",
"inputs": [
{"name": "email", "type": "email", "required": true},
{"name": "password", "type": "password", "required": true},
{"name": "csrfmiddlewaretoken", "type": "hidden", "value": "***"}
]
}
},
"recommendations": [
"403 Forbidden suggests bot protection. Try browser_login with manual interaction.",
"Import real browser cookies before login attempt."
]
}
{
"tool": "import_browser_cookies",
"arguments": {
"browser": "chrome",
"domain": "stepik.org",
"verbose": true
}
}
Получите детальную диагностику:
{
"cookies_imported": 0,
"diagnostics": {
"browser_found": true,
"cookie_file_path": "C:\\Users\\user\\AppData\\Local\\Google\\Chrome\\User Data",
"total_cookies_in_file": 150,
"domain_matches": 0,
"access_error": "Permission denied - browser data directory not accessible",
"cookie_breakdown": {
"total_found": 150,
"domain_filtered": 0,
"successfully_imported": 0,
"import_failures": 0
},
"system_info": {
"platform": "Windows",
"architecture": "64bit"
}
},
"recommendations": [
"No cookies found for domain 'stepik.org' in chrome.",
"Visit stepik.org in chrome browser first to create cookies.",
"Check domain spelling or try without domain filter."
]
}
{
"tool": "parse_page",
"arguments": {
"url": "https://stepik.org/login",
"custom_selectors": {
"csrf_token": {
"selector": "input[name='csrfmiddlewaretoken']",
"extract": "attribute",
"attribute": "value",
"fallbacks": [
"meta[name='csrf-token']",
"input[name*='csrf']"
]
},
"login_field": {
"selector": "input[name='email']",
"extract": "attribute",
"attribute": "name"
}
},
"smart_extraction": true,
"verbose": true
}
}
Получите точное извлечение:
{
"custom": {
"csrf_token": {
"values": ["xyz123token456"],
"count": 1,
"selector_used": "input[name='csrfmiddlewaretoken']",
"selectors_tried": 3,
"success": true,
"diagnostics": {
"primary_selectors": ["input[name='csrfmiddlewaretoken']"],
"fallback_selectors": ["meta[name='csrf-token']", "input[name*='csrf']"],
"extract_type": "attribute",
"attribute_name": "value"
}
},
"login_field": {
"values": ["email"],
"count": 1,
"selector_used": "input[name='email']",
"success": true
}
},
"extraction_stats": {
"successful_extractions": 2,
"failed_extractions": 0,
"total_values_extracted": 2
}
}
{"tool": "parse_page", "arguments": {"url": "https://site.com/login", "verbose": true}}
{"tool": "import_browser_cookies", "arguments": {"browser": "chrome", "verbose": true}}
{"tool": "browser_login", "arguments": {"url": "https://site.com/login", "verbose": true, "auto_screenshot_on_error": true}}
{"tool": "login_form", "arguments": {"login_url": "https://site.com/login", "username": "user", "password": "pass", "verbose": true}}
При первом запуске автоматически установятся:
uv syncuv run main.pyMIT License
FAQs
🚀 MCP SERVER FIXED v3.7.9! Resolved import errors, middleware conflicts, type hints - NOW WORKING PERFECTLY!
We found that web-parser-mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
An AI agent is merging PRs into major OSS projects and cold-emailing maintainers to drum up more work.

Research
/Security News
Chrome extension CL Suite by @CLMasters neutralizes 2FA for Facebook and Meta Business accounts while exfiltrating Business Manager contact and analytics data.

Security News
After Matplotlib rejected an AI-written PR, the agent fired back with a blog post, igniting debate over AI contributions and maintainer burden.