Back to Browse

Web2md MCP Server

Developer ToolsUse Caution3.5MCP RegistryLocal
Free

Server data from the Official MCP Registry

MCP Server for Web2MD — convert URLs to Markdown from Claude Desktop, Cursor, etc.

About

MCP Server for Web2MD — convert URLs to Markdown from Claude Desktop, Cursor, etc.

Security Report

3.5
Use Caution3.5High Risk

The MCP server properly uses environment variables for API key storage and implements reasonable authentication via bearer tokens. However, several moderate concerns exist: the server makes unauthenticated network calls to resolve extension IDs via API_BASE, logs potentially sensitive data (URLs, titles), lacks input validation on some parameters, and has broad network access that could enable data exfiltration if credentials are compromised. The core library (web2md-core) is clean, but the MCP server layer introduces risks through its bridge architecture and external API dependencies. Supply chain analysis found 13 known vulnerabilities in dependencies (2 critical, 3 high severity). Package verification found 1 issue (1 critical, 0 high severity).

5 files analyzed · 24 issues found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Permissions Required

This plugin requests these system permissions. Most are normal for its category.

env_vars

Check that this permission is expected for this type of plugin.

HTTP Network Access

Connects to external APIs or services over the internet.

TCP Network Access

Opens direct network connections, common for database or messaging tools.

File System Read

Reads files on your machine. Normal for tools that analyze or process local data.

process_spawn

Check that this permission is expected for this type of plugin.

Unverified package source

We couldn't verify that the installable package matches the reviewed source code. Proceed with caution.

What You'll Need

Set these up before or after installing:

Web2MD API key (w2m_...). Get one at https://web2md.org/dashboard, or run npx web2md-cli login instead.Required

Environment variable: WEB2MD_API_KEY

How to Install

Add this to your MCP configuration file:

{
  "mcpServers": {
    "org-web2md-web2md": {
      "env": {
        "WEB2MD_API_KEY": "your-web2md-api-key-here"
      },
      "args": [
        "-y",
        "web2md-core"
      ],
      "command": "npx"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub README.

web2md-core

Turn messy HTML into clean, LLM-ready Markdown.

This is the extraction and conversion engine behind Web2MD. It is a pure library — give it an HTML string, get Markdown back. No network calls, no API key, no account. Nothing in this package talks to a server.

npm install web2md-core

Why convert at all

Feeding raw HTML to a language model wastes most of your context window on markup, navigation, and ads. Converting first cuts that down and gives the model a document it can actually follow.

The library reports both numbers so you can see the difference:

import { convertToMarkdown } from 'web2md-core'

const result = convertToMarkdown(html, { url: 'https://example.com/post' })

console.log(result.markdown)
console.log(result.metadata.originalTokenCount, '→', result.metadata.tokenCount)
// e.g. 417 → 281

convertToMarkdown returns null when it cannot find a main content block — check for that rather than assuming a result.

What it does

  • Finds the actual article. Strips navigation, sidebars, ads, cookie banners, and footers, keeping the content a reader came for.
  • Preserves structure. Headings, lists, tables, and fenced code blocks survive the round trip — that structure is what lets a model answer questions about one specific section.
  • Reports tokens. Estimated counts for both the original HTML and the cleaned Markdown, plus helpers to split or trim for a target context window.
  • Runs anywhere. Uses linkedom for parsing, so it works in Node without a browser.

API

convertToMarkdown(html, options?)

The main entry point. Note the signature takes two arguments — the URL goes inside options, not as a positional parameter:

convertToMarkdown(html, { url: 'https://example.com/post' })
OptionDefaultMeaning
urlSource URL. Used to resolve relative links and fill metadata.url.
includeLinksfalseKeep <a> as Markdown links. Off by default because link URLs are often the bulk of the tokens on navigation-heavy pages.
includeImagesfalseKeep images. Off by default for the same reason.
includeMetafalsePrepend a metadata block (title, source, timestamp).
customRuleA CustomRule for site-specific extraction.
detectCodeLanguagefalseTry to infer the language of fenced code blocks.

includeLinks and includeImages default to off. That is deliberate — the primary use case is feeding an LLM, where both are usually noise. Turn them on when you are archiving rather than summarising.

Other exports

quickConvert(html, url?)        // same result, but with links, images and
                                // metadata turned ON — the "archive it" preset
extractContent(html, url?)      // main content element, before conversion
htmlToMarkdown(html, options?)  // low-level conversion, no extraction
countTokens(text)               // token estimate
splitByTokens(md, limit)        // chunk for RAG ingestion
optimizeForContextWindow(md, model)
htmlLooksLikeLoginWall(html)    // detect login walls so you can fail loudly
MODEL_CONTEXT_LIMITS            // context sizes for common models

Markdown → sanitized HTML (via DOMPurify), for previewing output:

renderMarkdownSync(md)
renderMarkdownFull(md)          // async; includes syntax highlighting
renderMarkdownWithFormulas(md)  // KaTeX math

getPageHTML() and getSelectionHTML() read document directly and therefore only work in a browser. They throw in Node — that boundary is intentional.

Site-specific extraction

Generic extraction handles most pages. When a site needs special treatment, pass a rule:

convertToMarkdown(html, {
  url: 'https://example.com/thread',
  customRule: {
    name: 'Example forum',
    domain: 'example.com',
    contentSelector: '.thread-body',
    removeSelectors: ['.signature', '.ad-slot'],
  },
})

Scope

This package covers extraction and conversion. It does not include Web2MD's browser extension, hosted API, or account system — those stay in the product.

Contributions to extraction quality are especially welcome: if a site converts badly, an issue with the URL and what went wrong is genuinely useful.

License

MIT

Reviews

No reviews yet

Be the first to review this server!