markdown-for-agents-mcp
markdown-for-agents-mcp
Сервер 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%.
Содержание
Возможности
Рендеринг 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-mcpChromium загружается автоматически через скрипт 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.
Аргументы:
Имя | Тип | Обязательно | Описание |
| string | да | URL для загрузки и преобразования |
| number | нет | Тайм-аут запроса в мс (переопределяет |
Пример:
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.
Аргументы:
Имя | Тип | Обязательно | Описание |
| string[] | да | URL для загрузки |
| 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).
web_search
Ищет в DuckDuckGo и опционально загружает топовые результаты в виде Markdown. Использует обычную HTTP-конечную точку, чтобы избежать обнаружения ботов — Playwright для самого поиска не используется.
Аргументы:
Имя | Тип | Обязательно | Описание |
| string | да | Поисковый запрос |
| number | нет | Макс. количество результатов (по умолчанию: 10) |
| string[] | нет | Включать результаты только с этих доменов |
| string[] | нет | Исключить результаты с этих доменов |
| boolean | нет | Загрузить и преобразовать страницы топовых результатов в Markdown |
| 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 и черный список доменов.
Аргументы:
Имя | Тип | Обязательно | Описание |
| string | да | URL файла для скачивания |
| 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Справочник команд
Команда | Описание |
| Загрузить один URL и вывести Markdown |
| Загрузить несколько URL в пакетном режиме |
| Скачать бинарный файл по локальному пути |
| Показать справку |
Конфигурация
Все настройки считываются из переменных окружения при запуске и проверяются с помощью Zod. Некорректные значения приводят к завершению работы с ненулевым кодом и описательной ошибкой.
Скопируйте .env.example в .env, чтобы начать:
cp .env.example .envСправочник
Переменная | По умолчанию | Описание |
|
| Тайм-аут для каждого запроса (мс) |
|
| Макс. параллельных загрузок в пакетных операциях |
|
| Макс. количество перенаправлений перед ошибкой |
|
| Макс. размер контента (символов) перед усечением |
|
|
|
|
|
|
|
| Макс. размер LRU-кэша (50 МБ) |
|
| TTL записи в кэше (15 минут) |
|
| Если |
| (пусто) | Домены через запятую для блокировки (или разрешения в режиме белого списка) |
| (пусто) | Регулярные выражения через запятую для блокировки по пути URL |
|
| Тайм-аут по умолчанию для поисковых запросов (мс) |
|
| Тайм-аут для скачивания бинарных файлов (мс) |
| (не задано) | Если задано, запускает HTTP-сервер на этом порту вместо stdio |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/JohnnyFoulds/markdown-for-agents-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server