Skip to content

@markdown-for-agents/express

npm version npm downloadstypes license

Express middleware for markdown-for-agents — a runtime-agnostic HTML to Markdown converter built for AI agents.

markdown-for-agents + Express

markdown-for-agents converts HTML to clean, token-efficient Markdown for AI agents — typically saving 80–90% of tokens. This package adds automatic content negotiation to your Express app via Accept: text/markdown. Try the playground to see the core conversion in action.

Add one line to your Express app and AI agents get clean, token-efficient Markdown instead of HTML. Normal browser requests pass through untouched.

How it works

The middleware uses content negotiation. When a client sends Accept: text/markdown, HTML responses are automatically converted to Markdown. The response includes:

  • Content-Type: text/markdown; charset=utf-8
  • x-markdown-tokens header with the token count
  • ETag header with a content hash for cache validation
  • Vary: Accept header so CDNs cache HTML and Markdown separately
  • content-signal header with publisher consent signals (when configured)

Install

bash
npm install @markdown-for-agents/express markdown-for-agents

markdown-for-agents is a peer dependency — you may already have it installed.

Usage

ts
import express from 'express';
import { markdown } from '@markdown-for-agents/express';

const app = express();
app.use(markdown({ extract: true }));

app.get('/', (req, res) => {
    res.send('<h1>Hello</h1><p>World</p>');
});

app.listen(3000);
bash
# Normal HTML response
curl http://localhost:3000

# Markdown response for AI agents
curl -H "Accept: text/markdown" http://localhost:3000

Full working example: See examples/express/ for a complete Express app with integration tests.

Options

Accepts all markdown-for-agents options:

ts
app.use(
    markdown({
        // Strip nav, ads, sidebars, cookie banners
        extract: true,

        // Resolve relative URLs
        baseUrl: 'https://example.com',

        // Remove duplicate content blocks
        deduplicate: true,

        // Custom token counter (e.g. tiktoken)
        tokenCounter: text => ({ tokens: enc.encode(text).length, characters: text.length, words: text.split(/\s+/).filter(Boolean).length }),

        // Publisher consent signal header
        contentSignal: { aiTrain: true, search: true, aiInput: true }
    })
);

Other frameworks

PackageFramework
@markdown-for-agents/fastifyFastify
@markdown-for-agents/honoHono
@markdown-for-agents/nextjsNext.js
@markdown-for-agents/webWeb Standard (Cloudflare Workers, Deno, Bun)

License

MIT

Released under the MIT License.