{
  "markdown": "# @copperline/rendex-mcp\n\n[![npm version](https://img.shields.io/npm/v/@copperline/rendex-mcp)](https://www.npmjs.com/package/@copperline/rendex-mcp)\n[![npm downloads](https://img.shields.io/npm/dw/@copperline/rendex-mcp)](https://www.npmjs.com/package/@copperline/rendex-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n[![MCP Badge](https://lobehub.com/badge/mcp/copperline-labs-rendex-mcp)](https://lobehub.com/mcp/copperline-labs-rendex-mcp)\n\nMCP server for [Rendex](https://rendex.dev) — render raw HTML, Markdown, or any URL to an image or PDF via AI agents using the Model Context Protocol.\n\n## Quick Start\n\n### Claude Desktop / Cursor / Windsurf (npx)\n\nAdd to your MCP client config:\n\n```json\n{\n  \"mcpServers\": {\n    \"rendex\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@copperline/rendex-mcp\"],\n      \"env\": {\n        \"RENDEX_API_KEY\": \"your-api-key\"\n      }\n    }\n  }\n}\n```\n\n**Where to add this:**\n\n| Client | Config location |\n|--------|----------------|\n| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) |\n| Cursor | `.cursor/mcp.json` in project root, or Settings > MCP |\n| Windsurf | Settings > MCP Servers |\n\n### Claude Code (CLI)\n\nAdd a `.mcp.json` to your project root with the same config above. Then restart Claude Code.\n\n> **Important**: Add `.mcp.json` to your `.gitignore` — it contains your API key.\n\n### Remote (zero-install, OAuth or API key)\n\nConnect to the hosted server at `https://mcp.rendex.dev/mcp` — no install needed.\nIt's fronted by **OAuth 2.1** (authorization-code + PKCE S256), so OAuth-capable\nclients (ChatGPT, Claude, Cursor, the MCP Inspector) connect with **no API key** —\nyou sign in with a one-time email code and each caller bills against their own\nRendex plan and credit pool.\n\nClients that prefer a static key can still pass one directly:\n\n```json\n{\n  \"mcpServers\": {\n    \"rendex\": {\n      \"url\": \"https://mcp.rendex.dev/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer your-api-key\"\n      }\n    }\n  }\n}\n```\n\n## Tools\n\n### `rendex_screenshot`\n\nRender any webpage, raw HTML, or Markdown to an image or PDF.\n\n```\n\"Take a screenshot of https://example.com\"\n\"Capture the full page of https://news.ycombinator.com in dark mode\"\n\"Generate a PDF of https://github.com with A4 page size\"\n\"Capture https://amazon.de as seen from Germany\"\n\"Render this HTML invoice as a PDF\"\n\"Render this Markdown release note as a PDF\"\n```\n\n**Parameters:**\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `url` | string | required* | Webpage URL to capture. Mutually exclusive with `html` and `markdown`. |\n| `html` | string | — | Raw HTML to render. Mutually exclusive with `url` and `markdown`. |\n| `markdown` | string | — | Markdown to render (server converts to HTML). Mutually exclusive with `url` and `html`. |\n| `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`. |\n| `format` | `\"png\"` \\| `\"jpeg\"` \\| `\"webp\"` \\| `\"pdf\"` | `\"png\"` | Output format |\n| `fullPage` | boolean | `false` | Capture full scrollable page |\n| `darkMode` | boolean | `false` | Emulate dark color scheme |\n| `width` | number | `1280` | Viewport width (320-3840) |\n| `height` | number | `800` | Viewport height (240-2160) |\n| `resizeWidth` | number | — | Downscale output to this width in px (aspect ratio preserved if `resizeHeight` omitted). Ignored for PDF |\n| `resizeHeight` | number | — | Downscale output to this height in px (aspect ratio preserved if `resizeWidth` omitted). Ignored for PDF |\n| `quality` | number | `80` | Image quality 1-100 (JPEG/WebP only, default 80) |\n| `delay` | number | `0` | Wait ms before capture |\n| `blockAds` | boolean | `true` | Block ads and trackers |\n| `blockCookieBanners` | boolean | — | Hide common cookie/consent banners (GDPR/CCPA) before capture |\n| `blockResourceTypes` | string[] | — | Block resource types: `font`, `image`, `media`, `stylesheet`, `other` |\n| `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` |\n| `deviceScaleFactor` | number | `2` | Device pixel ratio (1-3). 2× Retina by default |\n| `timeout` | number | `30` | Max seconds to wait for page load (5-60) |\n| `waitUntil` | string | `\"networkidle2\"` | Page readiness: `load`, `domcontentloaded`, `networkidle0`, `networkidle2` |\n| `waitForSelector` | string | — | CSS selector to wait for before capture |\n| `bestAttempt` | boolean | `true` | Return partial render on timeout instead of failing |\n| `selector` | string | — | CSS selector of element to capture instead of full page |\n| `hideSelectors` | string[] | — | CSS selectors to hide (`display:none`) before capture, e.g. `['.modal', '#newsletter-popup']`. Max 50 |\n| `css` | string | — | Custom CSS to inject before capture (max 50KB) |\n| `js` | string | — | Custom JavaScript to execute before capture (max 50KB) |\n| `cookies` | array | — | Cookies to set for authenticated captures (max 50) |\n| `headers` | object | — | Custom HTTP headers for the page request |\n| `userAgent` | string | — | Override browser user agent string |\n| `pdfFormat` | string | — | PDF page size: `A4`, `Letter`, `Legal`, `Tabloid`, `A3` |\n| `pdfLandscape` | boolean | — | PDF landscape orientation |\n| `pdfPrintBackground` | boolean | `true` | Print background in PDF |\n| `pdfScale` | number | `1` | PDF scale factor (0.1-2) |\n| `pdfMargin` | object | — | PDF margins: `{top, right, bottom, left}` as CSS values |\n| `geo` | string | — | ISO country code for geo-targeted capture (Pro/Enterprise) |\n| `geoCity` | string | — | City for geo-targeting (requires `geo`) |\n| `geoState` | string | — | State for geo-targeting (requires `geo`) |\n| `async` | boolean | — | Process asynchronously (returns job ID) |\n| `webhookUrl` | string | — | URL to receive callback when async capture completes (Starter+; Free/Basic poll job status) |\n| `cacheTtl` | number | — | Seconds to cache result (3600-2592000) |\n\n### `rendex_extract`\n\nExtract 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.\n\n```\n\"Extract the article text from https://example.com/post as Markdown\"\n\"Pull the readable content from this SPA as JSON so I can summarize it\"\n```\n\n**Parameters:**\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `url` | string | required | Webpage URL to extract readable content from |\n| `extractFormat` | `\"markdown\"` \\| `\"json\"` \\| `\"html\"` | `\"markdown\"` | Output shape — `markdown` (LLM-friendly prose), `json` (structured: title/byline/excerpt/siteName/length), or `html` (cleaned reader-mode HTML) |\n| `device` | string | — | Device preset (`desktop`, `iphone_15`, `iphone_se`, `pixel_8`, `ipad`, `ipad_pro`) — extract the mobile/tablet version of a page |\n| `blockAds` | boolean | `true` | Block ads and trackers before extraction |\n| `blockCookieBanners` | boolean | — | Hide common cookie/consent walls before extraction |\n| `hideSelectors` | string[] | — | CSS selectors to hide before extraction, e.g. `['.modal', '#newsletter-popup']`. Max 50 |\n| `waitUntil` | string | `\"networkidle2\"` | Page readiness: `load`, `domcontentloaded`, `networkidle0`, `networkidle2` |\n| `timeout` | number | `30` | Max seconds to wait for page load (5-60) |\n\n### `rendex_render_link`\n\nRender 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 }`.\n\n```\n\"Make me a hosted OG-image URL for this Markdown release note\"\n\"Give me a render link for this HTML card that I can drop into og:image\"\n```\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| *(all `rendex_screenshot` params)* | — | — | Same source (`url`/`html`/`markdown`), format, sizing, and templating options |\n| `expiresIn` | number | server TTL | Seconds until the signed URL expires (60–2592000) |\n\n### `render_artifact`\n\nTurn 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.**\n\n```\n\"Turn this Markdown report into a branded PDF and PNG with our logo and an orange accent\"\n\"Render this invoice HTML to a PDF and give me a share link that expires in a week\"\n```\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `content` | string | required | The Markdown or HTML body to render (up to ~4MB) |\n| `inputFormat` | `\"markdown\"` \\| `\"html\"` | `\"markdown\"` | How to interpret `content` — `markdown` is converted to styled HTML; `html` is used as a body fragment |\n| `formats` | `(\"pdf\" \\| \"png\")[]` | `[\"pdf\",\"png\"]` | Which formats to produce. Each costs 1 credit |\n| `accentColor` | string | — | CSS accent color for the bar, links, and headings (e.g. `#EA580C`) |\n| `logo` | string | — | http(s) URL of a logo image shown in the header |\n| `header` | string | — | plain-text header line shown beside the logo |\n| `footer` | string | — | plain-text footer line shown at the bottom |\n| `font` | string | — | CSS font-family stack for the body |\n| `pageSetup` | object | — | `{ size, orientation, margin{top,right,bottom,left}, scale, width, height, fullPage }` |\n| `data` | object | — | Mustache data — when set, `content` is rendered as a logic-less Mustache template (plus `{{logo}}`/`{{header}}`/… from `branding`) before conversion |\n| `expiresIn` | number | `86400` | Seconds until the hosted URLs expire (3600–2592000). Default 24h |\n\n### Rendex Watch\n\nMonitor 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).\n\n```\n\"Watch https://example.com/pricing for visual changes and alert my webhook\"\n\"Before I save it, test whether you can capture #pricing on that page\"\n\"Show me the last few runs of watch <id> — did anything change?\"\n```\n\n| Tool | Purpose | Key inputs |\n|------|---------|-----------|\n| `watch_create` | Create a watch (active → captures its baseline now) | `url`, `name?`, `intervalMinutes?`, `diffMode?` (visual/text/both), `threshold?`, `renderParams?`, `webhookUrl?` (Starter+), `notifyEmail?`, `paused?` |\n| `watch_test` | Dry-run a config first (creates nothing) | same as `watch_create` |\n| `watch_list` | List your watches | `status?` (active/paused/all), `cursor?`, `limit?` |\n| `watch_get` | Fetch one watch (+ baseline URL) | `id` |\n| `watch_run` | Run a check now (1 credit) | `id` |\n| `watch_runs` | Run history with signed before/after/overlay URLs | `id`, `cursor?`, `limit?` |\n| `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 |\n| `watch_delete` | Delete a watch + its runs | `id` |\n\n`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.\n\n### `rendex_account`\n\nCheck 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.**\n\n```\n\"How many Rendex renders do I have left this month?\"\n\"What plan am I on, and how do I upgrade for more?\"\n```\n\nReturns `{ plan, usage: { used, limit, remaining, unlimited, resetsAt }, rateLimitPerMinute, upgrade: { recommendedPlan, recommendedPlanCredits, upgradeUrl, manageBillingUrl } }`.\n\n## Data templating\n\nTurn one reusable template into many documents. Pass a `data` object alongside `html`\nor `markdown`, and Rendex renders the string as a logic-less [Mustache](https://mustache.github.io/)\ntemplate before capture — `{{var}}` interpolation, `{{#items}}…{{/items}}` loops, and\nnested `{{a.b}}` access. Great for invoices, reports, certificates, and OG cards.\n\n```\n\"Render this HTML invoice template to a PDF, filling it with this data:\n <h1>Invoice {{number}}</h1><p>Total: {{total}}</p>\n data = { number: 'INV-014', total: '$2,400' }\"\n```\n\n`data` is valid only with `html` or `markdown` — combining it with `url` returns a\nvalidation error.\n\n## Authentication\n\nGet your API key at [rendex.dev](https://rendex.dev).\n\nSet the `RENDEX_API_KEY` environment variable in your MCP client configuration.\n\n## Pricing\n\n| Plan | Calls/Month | Rate |\n|------|------------|------|\n| Free | 100 | 3/min |\n| Starter | 10,000 | 60/min |\n| Pro | 100,000 | 300/min |\n| Enterprise | Custom | 1,000/min |\n\n## License\n\nMIT — [Copperline Labs LLC](https://copperlinelabs.com)\n",
  "bytes": 14145,
  "sha": "08a40f582e17140927b8764eddf0ab2219deef2faca9fd222c674afa0d700426",
  "repo_slug": "copperline-labs/rendex-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_copperline_labs_rendex_mcp_c68d2bbe/readme"
}