Runtime-agnostic
Node.js, Bun, Deno, Cloudflare Workers, Vercel Edge, browsers — works everywhere.
Runtime-agnostic HTML to Markdown converter built for AI agents. One dependency, works everywhere.
Try the playground to see the conversion live in your browser, or audit any URL from the command line — no installation required:
npx @markdown-for-agents/audit https://docs.github.com/en/copilot/get-started/quickstart HTML Markdown Savings
───────────────────────────────────────────────────
Tokens 138,550 9,364 -93.2%
Chars 554,200 37,456 -93.2%
Words 27,123 4,044
Size 541.3 KB 36.6 KB -93.2%AI agents consume web pages as context, but raw HTML is full of markup noise — navigation, ads, sidebars, cookie banners, and deeply nested <div> soup. This wastes tokens and degrades LLM output quality.
markdown-for-agents converts HTML into clean, token-efficient Markdown with built-in content extraction. Inspired by Cloudflare's Markdown for Agents, it runs anywhere — Node.js, Bun, Deno, Cloudflare Workers, Vercel Edge, and browsers — with a single dependency.
npm install markdown-for-agentspip install markdown-for-agentsimport { convert } from 'markdown-for-agents';
const html = `
<h1>Hello World</h1>
<p>This is a <strong>simple</strong> example.</p>
`;
const { markdown, tokenEstimate } = convert(html);
console.log(markdown);
// # Hello World
//
// This is a **simple** example.
console.log(tokenEstimate);
// { tokens: 12, characters: 46, words: 8 }Real-world pages are full of boilerplate. Enable extraction to get just the main content:
const { markdown } = convert(html, { extract: true });This strips <nav>, <header>, <footer>, <aside>, ads, cookie banners, social widgets, and more — typically saving 80%+ tokens.
Serve Markdown automatically when AI agents request it via Accept: text/markdown. Normal browser requests pass through untouched:
import { markdown } from '@markdown-for-agents/express';
app.use(markdown({ extract: true }));Metadata is automatically extracted from <head> and prepended as YAML frontmatter:
const { markdown } = convert('<html><head><title>My Page</title></head>...</html>');
// ---
// title: My Page
// description: A great page about things
// ---Override how any element is converted:
import { convert, createRule } from 'markdown-for-agents';
const { markdown } = convert(html, {
rules: [
createRule(
node => node.attribs.class?.includes('callout'),
({ convertChildren, node }) => `\n\n> **Note:** ${convertChildren(node).trim()}\n\n`
)
]
});Middleware can set a content-signal HTTP header to communicate publisher consent for AI usage:
app.use(
markdown({
contentSignal: { aiTrain: true, search: true, aiInput: true }
})
);
// Sets header: content-signal: ai-train=yes, search=yes, ai-input=yes| Package | Description |
|---|---|
markdown-for-agents | Core HTML-to-Markdown converter |
@markdown-for-agents/audit | CLI & library to audit token/byte savings |
@markdown-for-agents/express | Express middleware |
@markdown-for-agents/fastify | Fastify plugin |
@markdown-for-agents/hono | Hono middleware |
@markdown-for-agents/nextjs | Next.js middleware (example) |
@markdown-for-agents/web | Web Standard middleware (Cloudflare Workers, Deno, Bun) |
| Package | Description |
|---|---|
markdown-for-agents | Core converter - zero dependencies, FastAPI/Flask/Django middleware |