Skip to main content
Glama
markdown-for-agents-mcp

markdown-for-agents-mcp

by JohnnyFoulds

markdown-for-agents-mcp

npm version npm downloads Node.js codecov License: MIT

Сервер MCP (Model Context Protocol), который загружает URL с полноценным рендерингом JavaScript и преобразует их в чистый, эффективный с точки зрения токенов Markdown для ИИ-агентов.

Большинство инструментов для получения данных MCP используют обычный HTTP — они видят то, что отправляет сервер, не выполняя JavaScript. Это работает для статических сайтов, но молча возвращает пустой или некорректный контент для React, Vue, Angular, SPA и любых страниц, загружающих данные динамически. Этот сервер запускает настоящий браузер Chromium через Playwright, поэтому он отрисовывает всю страницу перед извлечением — тот же контент, который увидел бы пользователь.

Работает на базе Playwright и библиотеки markdown-for-agents. Удаляет рекламу, навигацию и шаблонный код, потребляя до 80% меньше токенов, чем исходный HTML.


Зачем нужен Playwright?

Возможность

Обычные HTTP-загрузчики

markdown-for-agents-mcp

Статические HTML-страницы

✅

✅

Приложения React / Vue / Angular

❌

✅

Контент, отрисованный через JS

❌

✅

Маршруты одностраничных приложений (SPA)

❌

✅

Ленивая загрузка / бесконечная прокрутка

❌

✅

Эффективность токенов по сравнению с HTML

Средняя

До 80% меньше

Обход защиты от ботов

Нет

Ротация UA, спуфинг webdriver

Пример сокращения токенов: типичная страница новостной статьи — это ~150 КБ исходного HTML (~40 000 токенов). После рендеринга в Playwright, очистки DOM и преобразования в Markdown та же статья занимает ~2 000 токенов — сокращение на 95%.


Related MCP server: fetch-guard

Содержание


Возможности

  • Рендеринг JavaScript — Chromium под управлением Playwright отрисовывает React, Vue, Angular и любые страницы с активным JS перед извлечением.

  • Структурированный вывод — Инструменты возвращают типизированный structuredContent (url, title, markdown, fetchedAt, contentSize) вместе с текстовым ответом, совместимый с MCP SDK 1.11+.

  • Умное извлечение контента — Оценивает и выбирает основной блок контента (main > article > #content > body), автоматически отбрасывая боковые панели, навигацию и рекламу.

  • Эффективность токенов — Создает компактный Markdown, готовый для LLM; тесты показывают до 80% меньше токенов, чем в исходном HTML.

  • Веб-поиск — Поиск через DuckDuckGo с опциональной загрузкой и преобразованием топовых результатов.

  • LRU-кэш — Кэш в оперативной памяти объемом 50 МБ с TTL 15 минут позволяет избежать повторных загрузок.

  • Фильтрация доменов — Встроенный черный список трекеров/социальных сетей; поддерживает списки разрешенных/заблокированных доменов для каждого запроса и режим белого списка на уровне сервера.

  • Пакетная загрузка — Параллельная загрузка нескольких URL с настраиваемой степенью параллелизма.

  • Режим HTTP-сервера — Запуск в качестве HTTP-сервера (--http [port] или переменная окружения HTTP_PORT) с опциональной аутентификацией через bearer-токен.

  • Поддержка прокси — Передайте PLAYWRIGHT_PROXY для маршрутизации трафика Playwright через прокси.

  • Мониторинг состояния — Инструмент health_check предоставляет метрики кэша и загрузки.

  • Нулевая конфигурация — Chromium устанавливается автоматически при первом запуске.


Установка

npm install -g markdown-for-agents-mcp

Chromium загружается автоматически через скрипт postinstall. Если это не удалось, см. Устранение неполадок.

Вы также можете запустить его без глобальной установки, используя npx:

npx markdown-for-agents-mcp

Настройка MCP-клиента

Добавьте сервер в конфигурацию вашего MCP-клиента.

Claude Desktop

Отредактируйте ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) или %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "markdown": {
      "command": "markdown-mcp"
    }
  }
}

VS Code (Copilot / Continue)

Добавьте в рабочую область или пользовательский settings.json под соответствующим ключом расширения MCP, например:

{
  "mcpServers": {
    "markdown": {
      "command": "markdown-mcp"
    }
  }
}

Cursor / Windsurf / Zed

Любой клиент, реализующий спецификацию MCP, может использовать этот сервер. Точкой входа команды является markdown-mcp (доступно в PATH после глобальной установки) или полный путь к dist/index.js для локальных сборок.

С переопределением переменных окружения

{
  "mcpServers": {
    "markdown": {
      "command": "markdown-mcp",
      "env": {
        "FETCH_TIMEOUT_MS": "60000",
        "LOG_LEVEL": "DEBUG"
      }
    }
  }
}

Режим HTTP-сервера

Вместо stdio вы можете запустить сервер как стандартную HTTP-конечную точку — это полезно для общих развертываний, Docker или любого клиента, который предпочитает транспорт Streamable HTTP:

# Start on port 3456
markdown-mcp --http 3456

# Or use the env var
HTTP_PORT=3456 markdown-mcp

Весь трафик MCP обрабатывается по адресу POST|GET|DELETE /mcp. Чтобы требовать bearer-токен, установите MCP_AUTH_TOKEN:

MCP_AUTH_TOKEN=mysecrettoken HTTP_PORT=3456 markdown-mcp

Клиенты должны передавать Authorization: Bearer mysecrettoken с каждым запросом.


Доступные инструменты

fetch_url

Загружает один URL с полноценным рендерингом JavaScript и возвращает чистый Markdown.

Аргументы:

Имя

Тип

Обязательно

Описание

url

string

да

URL для загрузки и преобразования

timeout

number

нет

Тайм-аут запроса в мс (переопределяет FETCH_TIMEOUT_MS)

Пример:

fetch_url(url="https://example.com/blog/post")

Текстовый вывод (всегда присутствует, обратно совместим):

# Blog Post Title

Source: https://example.com/blog/post

This is the main content of the article, stripped of navigation, ads, and boilerplate.

## Related Section

More content here...

---
*Converted by markdown-for-agents-mcp*

Структурированный вывод (доступен клиентам MCP SDK 1.11+ через structuredContent):

{
  "url": "https://example.com/blog/post",
  "title": "Blog Post Title",
  "markdown": "# Blog Post Title\n\nSource: ...",
  "fetchedAt": "2026-04-06T17:00:00.000Z",
  "contentSize": 2048
}

fetch_urls

Загружает несколько URL параллельно и возвращает объединенный Markdown, по одной секции на каждый URL.

Аргументы:

Имя

Тип

Обязательно

Описание

urls

string[]

да

URL для загрузки

timeout

number

нет

Тайм-аут для каждого запроса в мс

Пример:

fetch_urls(urls=[
  "https://example.com/post1",
  "https://example.com/post2"
])

Текстовый вывод:

# Post 1 Title

Source: https://example.com/post1

...

---

# Post 2 Title

Source: https://example.com/post2

...

---

Структурированный вывод (через structuredContent):

{
  "results": [
    {
      "url": "https://example.com/post1",
      "title": "Post 1 Title",
      "markdown": "...",
      "fetchedAt": "2026-04-06T17:00:00.000Z",
      "contentSize": 1820,
      "success": true
    },
    {
      "url": "https://example.com/post2",
      "title": "Post 2 Title",
      "markdown": "...",
      "fetchedAt": "2026-04-06T17:00:00.000Z",
      "contentSize": 2104,
      "success": true
    }
  ],
  "summary": { "total": 2, "succeeded": 2, "failed": 0 }
}

Параллелизм контролируется параметром MAX_CONCURRENT_FETCHES (по умолчанию: 5).


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

Аргументы:

Имя

Тип

Обязательно

Описание

query

string

да

Поисковый запрос

maxResults

number

нет

Макс. количество результатов (по умолчанию: 10)

allowedDomains

string[]

нет

Включать результаты только с этих доменов

blockedDomains

string[]

нет

Исключить результаты с этих доменов

fetchResults

boolean

нет

Загрузить и преобразовать страницы топовых результатов в Markdown

timeout

number

нет

Тайм-аут запроса в мс

Пример — только поиск:

web_search(
  query="typescript tutorials",
  maxResults=5,
  allowedDomains=["typescriptlang.org", "github.com"]
)

Пример — поиск и загрузка:

web_search(
  query="react hooks guide",
  fetchResults=true,
  maxResults=3
)

Текстовый вывод:

# Web Search Results

## Query: typescript tutorials
**Found 5 results in 1234ms**

### Results:

1. [TypeScript Handbook](https://www.typescriptlang.org/docs/)
   The TypeScript Handbook provides comprehensive documentation...

2. [Best TypeScript Tutorials](https://github.com/danistefanovic/build-your-own-typescript)
   Learn TypeScript by building your own compiler...

Структурированный вывод (через structuredContent):

{
  "query": "typescript tutorials",
  "results": [
    { "title": "TypeScript Handbook", "url": "https://www.typescriptlang.org/docs/", "snippet": "...", "domain": "typescriptlang.org" }
  ],
  "fetchedContent": [
    { "url": "https://www.typescriptlang.org/docs/", "markdown": "..." }
  ],
  "durationMs": 1234
}

Примечание: Аргументы allowedDomains и blockedDomains применяются только к фильтрации результатов поиска. Настройки сервера BLOCKLIST_DOMAINS / USE_ALLOWLIST_MODE по-прежнему применяются, когда эти результаты впоследствии загружаются.


download_file

Скачивает бинарный файл (PDF, изображение, ZIP и т.д.) по URL и сохраняет его по локальному пути. Использует обычный HTTP-клиент — Playwright не требуется. Применяется защита от SSRF и черный список доменов.

Аргументы:

Имя

Тип

Обязательно

Описание

url

string

да

URL файла для скачивания

outputPath

string

да

Абсолютный локальный путь для сохранения файла (родительская директория должна существовать)

Пример:

download_file(
  url="https://example.com/report.pdf",
  outputPath="/tmp/report.pdf"
)

Вывод:

{
  "savedPath": "/tmp/report.pdf",
  "sizeBytes": 204800,
  "mimeType": "application/pdf",
  "filename": "report.pdf"
}

Примечание: URL с путями вроде /download/... разрешены для этого инструмента, даже если они заблокированы в fetch_url (чтобы избежать цепочек скачивания бинарных файлов). Используйте fetch_url для HTML-страниц — download_file отклонит ответы text/html.


health_check

Возвращает текущий статус сервера, метрики кэша и статистику загрузок. Полезно для мониторинга и отладки.

Аргументы: нет

Пример вывода:

{
  "status": "healthy",
  "cache": {
    "hits": 47,
    "misses": 15,
    "currentSize": 12,
    "totalBytes": 4194304,
    "maxBytes": 52428800
  },
  "metrics": {
    "totalFetches": 62,
    "successCount": 59,
    "errorCount": 3,
    "avgDuration": 1840,
    "cacheUtilization": 76
  }
}

Использование CLI

Автономный CLI (markdown-cli) включен для использования вне протокола MCP.

Один URL

markdown-cli https://example.com

Несколько URL (пакетный режим)

markdown-cli -b https://example.com https://example.org https://example.net

Сохранение в файл

markdown-cli https://example.com/article > article.md

Скачивание бинарного файла

markdown-cli -d -o /tmp/report.pdf https://example.com/report.pdf

Справочник команд

Команда

Описание

markdown-cli <url>

Загрузить один URL и вывести Markdown

markdown-cli -b <url1> <url2> ...

Загрузить несколько URL в пакетном режиме

markdown-cli -d -o <path> <url>

Скачать бинарный файл по локальному пути

markdown-cli --help

Показать справку


Конфигурация

Все настройки считываются из переменных окружения при запуске и проверяются с помощью Zod. Некорректные значения приводят к завершению работы с ненулевым кодом и описательной ошибкой.

Скопируйте .env.example в .env, чтобы начать:

cp .env.example .env

Справочник

Переменная

По умолчанию

Описание

FETCH_TIMEOUT_MS

30000

Тайм-аут для каждого запроса (мс)

MAX_CONCURRENT_FETCHES

5

Макс. параллельных загрузок в пакетных операциях

MAX_REDIRECTS

10

Макс. количество перенаправлений перед ошибкой

MAX_CONTENT_LENGTH

100000

Макс. размер контента (символов) перед усечением

LOG_LEVEL

INFO

DEBUG, INFO, WARN или ERROR

LOG_FORMAT

text

text (читаемый человеком) или json (структурированный)

CACHE_MAX_BYTES

52428800

Макс. размер LRU-кэша (50 МБ)

CACHE_TTL_MS

900000

TTL записи в кэше (15 минут)

USE_ALLOWLIST_MODE

false

Если true, разрешены только домены из BLOCKLIST_DOMAINS

BLOCKLIST_DOMAINS

(пусто)

Домены через запятую для блокировки (или разрешения в режиме белого списка)

BLOCKLIST_URL_PATTERNS

(пусто)

Регулярные выражения через запятую для блокировки по пути URL

WEB_SEARCH_DEFAULT_TIMEOUT_MS

30000

Тайм-аут по умолчанию для поисковых запросов (мс)

DOWNLOAD_TIMEOUT_MS

60000

Тайм-аут для скачивания бинарных файлов (мс)

HTTP_PORT

(не задано)

Если задано, запускает HTTP-сервер на этом порту вместо stdio

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      An MCP server that fetches web pages and extracts clean, AI-friendly Markdown content using Mozilla Readability. It provides secure web access for LLMs with built-in SSRF protection and automated content cleaning for improved context retrieval and summarization.
      1
      98 npm
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Fetch URLs and return clean, LLM-ready markdown with metadata and layered prompt injection defense. Configurable timeouts, word limits, JS rendering, and link extraction. All-in-one MCP server + CLI.
      1
      2
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      A fault-tolerant, stealth-enabled Model Context Protocol (MCP) server for web searching and content fetching. Built for AI Agents (Cursor, Claude Code, OpenCode), it uses a stealth browser engine to fetch pages, dynamically handles SPAs/React, and converts bloat into token-optimized Markdown.
      2
      28 npm
      18 PyPI
      4
      MIT

    Appeared in Searches