Skip to main content
Glama

@copperline/rendex-mcp

npm version npm downloads License: MIT MCP Badge

MCP server for Rendex — render raw HTML, Markdown, or any URL to an image or PDF via AI agents using the Model Context Protocol.

Quick Start

Claude Desktop / Cursor / Windsurf (npx)

Add to your MCP client config:

{
  "mcpServers": {
    "rendex": {
      "command": "npx",
      "args": ["-y", "@copperline/rendex-mcp"],
      "env": {
        "RENDEX_API_KEY": "your-api-key"
      }
    }
  }
}

Where to add this:

Client

Config location

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json (macOS)

Cursor

.cursor/mcp.json in project root, or Settings > MCP

Windsurf

Settings > MCP Servers

Claude Code (CLI)

Add a .mcp.json to your project root with the same config above. Then restart Claude Code.

Important: Add .mcp.json to your .gitignore — it contains your API key.

Remote (zero-install, OAuth or API key)

Connect to the hosted server at https://mcp.rendex.dev/mcp — no install needed. It's fronted by OAuth 2.1 (authorization-code + PKCE S256), so OAuth-capable clients (ChatGPT, Claude, Cursor, the MCP Inspector) connect with no API key — you sign in with a one-time email code and each caller bills against their own Rendex plan and credit pool.

Clients that prefer a static key can still pass one directly:

{
  "mcpServers": {
    "rendex": {
      "url": "https://mcp.rendex.dev/mcp",
      "headers": {
        "Authorization": "Bearer your-api-key"
      }
    }
  }
}

Related MCP server: Screenshot API

Tools

rendex_screenshot

Render any webpage, raw HTML, or Markdown to an image or PDF.

"Take a screenshot of https://example.com"
"Capture the full page of https://news.ycombinator.com in dark mode"
"Generate a PDF of https://github.com with A4 page size"
"Capture https://amazon.de as seen from Germany"
"Render this HTML invoice as a PDF"
"Render this Markdown release note as a PDF"

Parameters:

Parameter

Type

Default

Description

url

string

required*

Webpage URL to capture. Mutually exclusive with html and markdown.

html

string

—

Raw HTML to render. Mutually exclusive with url and markdown.

markdown

string

—

Markdown to render (server converts to HTML). Mutually exclusive with url and html.

data

object

—

Key-value data for Mustache templating. When set, the html or markdown string is rendered as a logic-less Mustache template before capture. Invalid with url.

format

"png" | "jpeg" | "webp" | "pdf"

"png"

Output format

fullPage

boolean

false

Capture full scrollable page

darkMode

boolean

false

Emulate dark color scheme

width

number

1280

Viewport width (320-3840)

height

number

800

Viewport height (240-2160)

resizeWidth

number

—

Downscale output to this width in px (aspect ratio preserved if resizeHeight omitted). Ignored for PDF

resizeHeight

number

—

Downscale output to this height in px (aspect ratio preserved if resizeWidth omitted). Ignored for PDF

quality

number

80

Image quality 1-100 (JPEG/WebP only, default 80)

delay

number

0

Wait ms before capture

blockAds

boolean

true

Block ads and trackers

blockCookieBanners

boolean

—

Hide common cookie/consent banners (GDPR/CCPA) before capture

blockResourceTypes

string[]

—

Block resource types: font, image, media, stylesheet, other

device

string

—

Device preset: desktop, iphone_15, iphone_se, pixel_8, ipad, ipad_pro — sets viewport, scale, and user agent in one shot. Overrides width/height/deviceScaleFactor/userAgent

deviceScaleFactor

number

2

Device pixel ratio (1-3). 2× Retina by default

timeout

number

30

Max seconds to wait for page load (5-60)

waitUntil

string

"networkidle2"

Page readiness: load, domcontentloaded, networkidle0, networkidle2

waitForSelector

string

—

CSS selector to wait for before capture

bestAttempt

boolean

true

Return partial render on timeout instead of failing

selector

string

—

CSS selector of element to capture instead of full page

hideSelectors

string[]

—

CSS selectors to hide (display:none) before capture, e.g. ['.modal', '#newsletter-popup']. Max 50

css

string

—

Custom CSS to inject before capture (max 50KB)

js

string

—

Custom JavaScript to execute before capture (max 50KB)

cookies

array

—

Cookies to set for authenticated captures (max 50)

headers

object

—

Custom HTTP headers for the page request

userAgent

string

—

Override browser user agent string

pdfFormat

string

—

PDF page size: A4, Letter, Legal, Tabloid, A3

pdfLandscape

boolean

—

PDF landscape orientation

pdfPrintBackground

boolean

true

Print background in PDF

pdfScale

number

1

PDF scale factor (0.1-2)

pdfMargin

object

—

PDF margins: {top, right, bottom, left} as CSS values

geo

string

—

ISO country code for geo-targeted capture (Pro/Enterprise)

geoCity

string

—

City for geo-targeting (requires geo)

geoState

string

—

State for geo-targeting (requires geo)

async

boolean

—

Process asynchronously (returns job ID)

webhookUrl

string

—

URL to receive callback when async capture completes (Starter+; Free/Basic poll job status)

cacheTtl

number

—

Seconds to cache result (3600-2592000)

rendex_extract

Extract clean reader-mode content from any webpage as Markdown, JSON, or HTML. Runs the same Chromium render pass as a screenshot, so it captures content after JavaScript runs — handling SPAs that fetch-only readers miss. Strips nav, ads, and boilerplate, returning the article body plus title, byline, and excerpt. Great for feeding page content to an LLM, summarization, or RAG ingestion.

"Extract the article text from https://example.com/post as Markdown"
"Pull the readable content from this SPA as JSON so I can summarize it"

Parameters:

Parameter

Type

Default

Description

url

string

required

Webpage URL to extract readable content from

extractFormat

"markdown" | "json" | "html"

"markdown"

Output shape — markdown (LLM-friendly prose), json (structured: title/byline/excerpt/siteName/length), or html (cleaned reader-mode HTML)

device

string

—

Device preset (desktop, iphone_15, iphone_se, pixel_8, ipad, ipad_pro) — extract the mobile/tablet version of a page

blockAds

boolean

true

Block ads and trackers before extraction

blockCookieBanners

boolean

—

Hide common cookie/consent walls before extraction

hideSelectors

string[]

—

CSS selectors to hide before extraction, e.g. ['.modal', '#newsletter-popup']. Max 50

waitUntil

string

"networkidle2"

Page readiness: load, domcontentloaded, networkidle0, networkidle2

timeout

number

30

Max seconds to wait for page load (5-60)

Render a URL, raw HTML, or Markdown and get back a signed, hosted, edge-cached image URL instead of the bytes — ideal for dynamic OG images. Drop the URL into <meta property="og:image"> or an <img> tag and Rendex serves a cached copy on every share. Takes the same parameters as rendex_screenshot, plus an optional expiresIn. Returns { url, expiresAt, format, cacheTtl }.

"Make me a hosted OG-image URL for this Markdown release note"
"Give me a render link for this HTML card that I can drop into og:image"

Parameter

Type

Default

Description

(all rendex_screenshot params)

—

—

Same source (url/html/markdown), format, sizing, and templating options

expiresIn

number

server TTL

Seconds until the signed URL expires (60–2592000)

render_artifact

Turn Markdown or HTML into a branded, downloadable artifact — a PDF, a PNG, and a hosted share page — in one call. Ideal for agent outputs: reports, invoices, summaries, release notes, dashboards. Apply a logo, accent color, font, header, and footer; choose PDF page size/orientation/margins. Returns hosted URLs { pdfUrl, pngUrl, shareUrl, expiresAt } — no storage needed on your side. Each requested format costs 1 render credit.

"Turn this Markdown report into a branded PDF and PNG with our logo and an orange accent"
"Render this invoice HTML to a PDF and give me a share link that expires in a week"

Parameter

Type

Default

Description

content

string

required

The Markdown or HTML body to render (up to ~4MB)

inputFormat

"markdown" | "html"

"markdown"

How to interpret content — markdown is converted to styled HTML; html is used as a body fragment

formats

("pdf" | "png")[]

["pdf","png"]

Which formats to produce. Each costs 1 credit

accentColor

string

—

CSS accent color for the bar, links, and headings (e.g. #EA580C)

logo

string

—

http(s) URL of a logo image shown in the header

header

string

—

plain-text header line shown beside the logo

footer

string

—

plain-text footer line shown at the bottom

font

string

—

CSS font-family stack for the body

pageSetup

object

—

{ size, orientation, margin{top,right,bottom,left}, scale, width, height, fullPage }

data

object

—

Mustache data — when set, content is rendered as a logic-less Mustache template (plus {{logo}}/{{header}}/… from branding) before conversion

expiresIn

number

86400

Seconds until the hosted URLs expire (3600–2592000). Default 24h

Rendex Watch

Monitor a URL on a schedule and get notified when it changes — real-Chrome visual diff (with a highlighted overlay), an extracted-text diff, or both. Eight tools let an agent set up, inspect, edit, and tear down watches on the shared Rendex platform (one rdx_ key, one credit pool).

"Watch https://example.com/pricing for visual changes and alert my webhook"
"Before I save it, test whether you can capture #pricing on that page"
"Show me the last few runs of watch <id> — did anything change?"

Tool

Purpose

Key inputs

watch_create

Create a watch (active → captures its baseline now)

url, name?, intervalMinutes?, diffMode? (visual/text/both), threshold?, renderParams?, webhookUrl? (Starter+), notifyEmail?, paused?

watch_test

Dry-run a config first (creates nothing)

same as watch_create

watch_list

List your watches

status? (active/paused/all), cursor?, limit?

watch_get

Fetch one watch (+ baseline URL)

id

watch_run

Run a check now (1 credit)

id

watch_runs

Run history with signed before/after/overlay URLs

id, cursor?, limit?

watch_update

Edit a watch in place — interval, diff mode, channels, render params

id, plus any watch_create field; webhookUrl/notifyEmail accept null to clear a channel

watch_delete

Delete a watch + its runs

id

renderParams carries the per-check capture knobs (fullPage defaults to true, selector, device, geo (Pro+), plus noise controls ignoreRegions/ignoreText/minTextChars/suppressWhilePresent and uaMode). Interval floors are per-plan (Free 1440 / Basic 180 / Starter 60 / Pro 30 / Enterprise 5). Watch metadata + signed image URLs are returned as JSON text.

rendex_account

Check the account from inside the agent: which plan it's on, how many render credits have been used this month vs. the limit (and when it resets), the per-minute rate limit, and a one-tap upgrade link. Lets an agent answer "how much have I used?" or "how do I get more renders?" without sending the user to the dashboard. Read-only — costs no credits.

"How many Rendex renders do I have left this month?"
"What plan am I on, and how do I upgrade for more?"

Returns { plan, usage: { used, limit, remaining, unlimited, resetsAt }, rateLimitPerMinute, upgrade: { recommendedPlan, recommendedPlanCredits, upgradeUrl, manageBillingUrl } }.

Data templating

Turn one reusable template into many documents. Pass a data object alongside html or markdown, and Rendex renders the string as a logic-less Mustache template before capture — {{var}} interpolation, {{#items}}…{{/items}} loops, and nested {{a.b}} access. Great for invoices, reports, certificates, and OG cards.

"Render this HTML invoice template to a PDF, filling it with this data:
 <h1>Invoice {{number}}</h1><p>Total: {{total}}</p>
 data = { number: 'INV-014', total: '$2,400' }"

data is valid only with html or markdown — combining it with url returns a validation error.

Authentication

Get your API key at rendex.dev.

Set the RENDEX_API_KEY environment variable in your MCP client configuration.

Pricing

Plan

Calls/Month

Rate

Free

100

3/min

Starter

10,000

60/min

Pro

100,000

300/min

Enterprise

Custom

1,000/min

License

MIT — Copperline Labs LLC

Available Tools

11 tools
rendex_extractAInspect

Extract clean reader-mode content from any webpage as Markdown, JSON, or HTML. Runs the same Chromium render pass as a screenshot, so it captures content after JavaScript runs — handles SPAs that fetch-only readers miss. Strips nav, ads, and boilerplate, returning the article body plus title, byline, and excerpt. Great for feeding page content to an LLM, summarization, or RAG ingestion.

Inputs: url (required), extractFormat, waitUntil, timeout, +4 more.

rendex_screenshotAInspect

Capture a screenshot or PDF of any webpage, raw HTML, or Markdown. Supports full-page capture, dark mode, ad blocking, custom viewports, CSS/JS injection, cookie/header injection, PDF output, HTML and Markdown rendering, and progressive fallback for heavy sites. Returns partial renders on timeout by default (bestAttempt mode).

Inputs: url, html, markdown, format, +36 more.

watch_createBInspect

Create a Rendex Watch — monitor a URL on a schedule and get notified when it changes (real-Chrome visual diff with a highlighted overlay, an extracted-text diff, or both). An active watch captures its baseline immediately. Returns the created watch as JSON.

Inputs: url (required), name, intervalMinutes, diffMode, +6 more.

watch_deleteAInspect

Delete a watch and its run history. Irreversible.

Inputs: id (required).

watch_getAInspect

Fetch one watch by ID, including its current baseline image URL and status. Returns JSON.

Inputs: id (required).

watch_listAInspect

List your watches (newest first), optionally filtered by status and paged. Returns { items, nextCursor }.

Inputs: status, cursor, limit.

watch_runAInspect

Run an immediate check now (charges 1 credit). Returns the queued run; poll watch_runs for the result or receive a watch.changed webhook.

Inputs: id (required).

watch_runsAInspect

Read a watch's run history (newest first), paged. Each run includes changed, diffScore, and signed before/after/overlay image URLs. Returns { items, nextCursor }.

Inputs: id (required), cursor, limit.

watch_testAInspect

Dry-run a watch config BEFORE creating it — render the proposed config once and report what was captured + whether the page is reachable (and the text a text-watch would compare). Creates no watch, no baseline, no diff. Use this to validate a selector/scope/identity first. Returns JSON.

Inputs: url (required), name, intervalMinutes, diffMode, +6 more.

watch_updateAInspect

Update a watch in place — pause/resume (paused), re-point (url), change schedule/diff/notify settings, or turn a channel off (webhookUrl/notifyEmail = null). Only the fields you send change; renderParams is deep-merged over the existing config. A scope change (url/selector/fullPage/size/device) re-baselines on the next check. Returns the updated watch as JSON.

Inputs: id (required), url, name, intervalMinutes, +7 more.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 11 tools

    Disambiguation4/5

    The two tool families are clearly separated (rendering vs. watch management), and each watch operation has a distinct role. However, rendex_screenshot and rendex_render_link share nearly the same rendering pipeline and options, and watch_run vs. watch_runs differ by only one letter, so a couple of tools could still be misselected without careful reading.

    Naming Consistency4/5

    All tool names use snake_case and a recognizable family prefix: rendex_* for rendering and watch_* for watch management. The imperative verb pattern is mostly consistent within the watch family, though watch_runs is a noun rather than a verb and rendex_screenshot reads as a noun, creating minor inconsistency.

    Tool Count5/5

    At 11 tools, the surface is well-scoped and reasonable for the server's dual purpose: three rendering/capture tools and eight watch lifecycle tools. Each tool has a clear job, and none feel redundant or unnecessary.

    Completeness5/5

    The watch family is fully fleshed out with create, read, list, update, delete, test, run, and history operations. The rendering family covers capture, extraction, and hosted-link generation, which covers the apparent domain without obvious dead ends.

    Maintenance

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI agents to capture any public URL as PNG, JPEG, or PDF via REST API or MCP tools, including screenshot capture, page description, and PDF rendering.
      18 npm
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Hosted, SSRF-safe, cached screenshots and Open Graph images for AI agents - no headless Chrome to run.
      46 npm
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Screenshot, visual-diff, and AI page-analysis API for AI agents. Capture any URL as PNG, JPEG, WebP, PDF, or HTML, diff two versions of a page to catch visual regressions, and get an AI summary of what a page contains.
      3
      62 npm
      1
      MIT