# Benchline (remote · benchline.fabwaseem.com)

Open-source developer, PDF, image, SEO and security tools over a stateless HTTP MCP server. No key.

- Trust score: 18/100 (low)
- Change this week: 0
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-04

> **Recent critical change**: TLS certificate (2026-11-04). See the changelog below before you install this server.

## Components

- remote · `benchline.fabwaseem.com`: 18/100 (this document), [markdown](https://verifymcp.io/servers/fabwaseem-benchline/benchline.md), [page](https://verifymcp.io/servers/fabwaseem-benchline/benchline)

## Channel facts

- Endpoint: `https://benchline.fabwaseem.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.1.1`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-04.

- **Endpoint Security**: 0/100
  - TLS check failed: the certificate doesn't match the endpoint's hostname.
  - Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.
  - HTTPS enforcement could not be verified: the plaintext port answered with HTTP 503, which proves neither a plaintext path nor enforcement.
  - HSTS not yet verified: we couldn't read the response headers to check for it.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 0/100
  - Transport check failed: declared streamable-http, but the TLS certificate failed verification.
- **Schema Quality & AI Usability**: 0/100
  - Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 0/100
  - Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Tool Safety**: 0/100
  - Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Capabilities**: 0/100
  - Capabilities not yet verified: we couldn't read the endpoint's capabilities.

**Unverified: 5 categories.** Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

## Install

### How do I install the Benchline MCP server?

Benchline is a hosted endpoint at https://benchline.fabwaseem.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http fabwaseem-benchline 'https://benchline.fabwaseem.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "fabwaseem-benchline": {
      "url": "https://benchline.fabwaseem.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "fabwaseem-benchline": {
      "type": "http",
      "url": "https://benchline.fabwaseem.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.fabwaseem-benchline]
url = "https://benchline.fabwaseem.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "fabwaseem-benchline": {
      "type": "remote",
      "url": "https://benchline.fabwaseem.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add fabwaseem-benchline --url 'https://benchline.fabwaseem.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  fabwaseem-benchline:
    url: "https://benchline.fabwaseem.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "fabwaseem-benchline": {
      "Transport": "http",
      "Url": "https://benchline.fabwaseem.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add fabwaseem-benchline -t streamable-http -u 'https://benchline.fabwaseem.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "fabwaseem-benchline": {
      "type": "http",
      "url": "https://benchline.fabwaseem.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 18, 0)

- [critical regression] TLS certificate: pass → fail
- [critical regression] Score status: scored → failed
- [security regression] Endpoint reachability: not serving MCP → unreachable
- [security regression] HSTS header: fail → unverified
- [security] Transport: Transport check failed: declared streamable-http, but the TLS certificate failed verification.

### 2026-10-24 (score 18, −44)

- [security regression] Endpoint reachability: reachable → not serving MCP
- [security regression] Stability: 0.13 → unverified
- [security regression] Tool safety: pass → unverified
- [security regression] HTTPS: pass → unverified
- [security regression] Transport: pass → fail
- [security] Authorization: Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-10-23 (score 62, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-21 (score 61, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-20 (score 60, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-19 (score 60)

First indexed and scored.

## MCP tools (82)

### `generate_llms_txt` (~78 tokens)

Generate llms.txt

Render llms.txt and llms-full.txt from a site name, a summary, and a list of pages. It does not crawl. Grouping follows the page URLs.

Input parameters:

- `pages` (array, required): Pages you already know. This tool does not fetch them.
- `siteName` (string, required)
- `summary` (string, required)

Output parameters:

- `full` (string)
- `llms` (string)

### `score_ai_seo` (~75 tokens)

Score a page for AI search

Fetch a public page plus its robots.txt, sitemap, and llms.txt, then score how ready it is for AI search crawlers. Use this when you have a live URL.

Input parameters:

- `url` (string, required): A public page. The check also reads robots.txt, sitemap.xml, and llms.txt on that origin.

Output parameters:

- `checks` (array)
- `finalUrl` (string)
- `score` (number)
- `status` (number)

### `build_open_graph` (~421 tokens)

Build an Open Graph card

Render one of the Open Graph templates as a PNG and a Next.js opengraph-image.tsx file. Pass a template id from list_og_templates, the fields that template uses, colors, a size, and optional base64 images.

Input parameters:

- `after` (string): After image as base64, a data URI, or a public URL.
- `afterValue` (string)
- `author` (string)
- `avatar` (string): Portrait image as base64, a data URI, or a public URL.
- `badge` (string)
- `before` (string): Before image as base64, a data URI, or a public URL.
- `beforeValue` (string)
- `brand` (string): Brand name shown on templates that have a brand row.
- `caption` (string)
- `colors` (object)
- `command` (string)
- `cta` (string)
- `date` (string)
- `episode` (string)
- `eyebrow` (string)
- `hero` (string): Hero image as base64, a data URI, or a public URL.
- `imageUrl` (string): Public URL written into og:image. This does not fetch the file.
- `logo` (string): Logo image as base64, a data URI, or a public URL. Private addresses are refused. 10 MB cap.
- `meta` (string)
- `price` (string)
- `quote` (string)
- `readTime` (string)
- `role` (string)
- `size` (string)
- `stat` (string)
- `statLabel` (string)
- `steps` (string): One step per line.
- `subtitle` (string)
- `template` (string): Template id from list_og_templates.
- `time` (string)
- `title` (string)
- `url` (string)
- `versions` (string): One version per line, as v2.3 | Note.

Output parameters:

- `height` (number)
- `metaTags` (string)
- `mimeType` (string)
- `png` (string): PNG bytes, base64 encoded.
- `source` (string)
- `template` (string)
- `width` (number)

### `list_og_templates` (~38 tokens)

List Open Graph templates

List Open Graph card templates with ids, names, categories, defaults, color presets, and field schemas.

Input parameters:

- `category` (string)

Output parameters:

- `templates` (array)

### `decode_jwt` (~61 tokens)

Decode a JWT

Decode a signed JSON Web Token into its header, payload, and registered claims. Dates are absolute ISO timestamps. The signature is not checked.

Input parameters:

- `token` (string, required): A signed JWT, with or without a Bearer prefix. The signature is not verified.

Output parameters:

- `claims` (array)
- `error` (string)
- `header` (object)
- `kind` (string)
- `ok` (boolean)
- `payload` (object)
- `signature` (string)

### `check_robots_txt` (~72 tokens)

Check robots.txt

Fetch a public robots.txt and report whether the wildcard group blocks the site and whether Sitemap lines are absolute. Use this when you have a URL, not a pasted file.

Input parameters:

- `url` (string, required): A public page or a robots.txt URL. A page URL is resolved to /robots.txt on that origin.

Output parameters:

- `document` (object)
- `finalUrl` (string)
- `issues` (array)
- `status` (number)
- `text` (string)

### `inspect_meta_tags` (~60 tokens)

Inspect meta tags

Fetch one public HTML page and report title, description, canonical, Open Graph, Twitter, and JSON-LD. Use this to see what a live URL advertises.

Input parameters:

- `url` (string, required): A public HTML page. Only that URL is fetched.

Output parameters:

- `canonical` (string)
- `checks` (array)
- `description` (string)
- `finalUrl` (string)
- `icons` (array)
- `jsonLdTypes` (array)
- `lang` (string)
- `og` (object)
- `redirects` (array)
- `robots` (string)
- `status` (number)
- `themeColor` (string)
- `title` (string)
- `twitter` (object)
- `viewport` (string)

### `build_json_ld` (~75 tokens)

Build JSON-LD

Build schema.org JSON-LD for one type, plus a script tag and a list of missing fields. Use this when you already know the fields. It does not fetch a page.

Input parameters:

- `type` (string, required)
- `values` (object, required): Fields for the chosen schema.org type. Repeatable fields are arrays of objects.

Output parameters:

- `checks` (array)
- `json`
- `script` (string)

### `count_tokens` (~106 tokens)

Count tokens

Count tokens with the o200k or cl100k encoder and price the count against the published model table. Claude and Gemini rows are estimates, not those vendors' tokenizers.

Input parameters:

- `cachedRatio` (number)
- `encoding` (string)
- `modelIds` (array): Price rows to return. Unknown ids are rejected.
- `outputTokens` (integer)
- `requestsPerDay` (number)
- `text` (string, required): The prompt or document to count.

Output parameters:

- `chars` (number)
- `count` (number)
- `encoding` (string)
- `prices` (array)
- `words` (number)

### `explain_cron` (~115 tokens)

Explain a cron expression

Turn a cron expression into English, the next UTC run times, and snippets for crontab, GitHub Actions, Vercel, Kubernetes, and node-cron.

Input parameters:

- `dialect` (string)
- `expression` (string, required): A cron expression, including @daily or @reboot.
- `now` (string): ISO timestamp used as the clock. Omit it to use the current time.
- `timeZone` (string): IANA time zone used to list the next runs. Hosted schedules stay in UTC.

Output parameters:

- `english` (string)
- `error` (string)
- `fields` (array)
- `hostedNote` (string)
- `runs` (array)
- `snippets` (array)
- `valid` (boolean)

### `build_nextjs_dockerfile` (~141 tokens)

Build a Next.js Dockerfile

Generate a production Dockerfile, dockerignore, compose file, and next.config snippet for a Next.js app. Defaults match a pnpm standalone image.

Input parameters:

- `base` (string)
- `cacheMounts` (boolean)
- `healthPath` (string)
- `healthcheck` (boolean)
- `migrate` (boolean)
- `node` (string)
- `packageManager` (string)
- `port` (integer)
- `prisma` (boolean)
- `publicEnvs` (array)
- `standalone` (boolean)
- `telemetryDisabled` (boolean)
- `turbo` (boolean)

Output parameters:

- `commands` (string)
- `compose` (string)
- `dockerfile` (string)
- `dockerignore` (string)
- `estimatedSize` (string)
- `image` (string)
- `nextConfig` (string)

### `format_json` (~95 tokens)

Format and validate JSON

Pretty-print or minify JSON. A number that does not fit in a JavaScript number keeps the digits you sent. Returns the formatted text when it is valid, or the line and column of each syntax error.

Input parameters:

- `indent` (string)
- `json` (string, required): JSON text to format or validate.
- `minify` (boolean)
- `sortKeys` (boolean): Sort object keys. Array order is kept.

Output parameters:

- `errors` (array)
- `output` (string)
- `valid` (boolean)

### `convert_data_format` (~83 tokens)

Convert JSON, YAML, TOML, or XML

Convert between JSON, YAML, TOML, and XML. Auto-detects the source. Numbers that do not fit in a JavaScript number keep their digits. Errors include a line and column. TOML refuses null and a non-table root.

Input parameters:

- `from` (string)
- `text` (string, required): The source document.
- `to` (string)

Output parameters:

- `column`
- `detected` (string)
- `error` (string)
- `line`
- `ok` (boolean)
- `output` (string)

### `convert_csv_json` (~140 tokens)

Convert CSV and JSON

Convert CSV to JSON or JSON to CSV. Supports comma, tab, semicolon, and pipe delimiters, an optional header, type inference, and dotted flattening. Inferred numbers that do not fit in a JavaScript number keep their digits.

Input parameters:

- `delimiter` (string): Comma, tab, semicolon, pipe, or auto. Auto is a comma when writing CSV.
- `direction` (string)
- `flatten` (boolean): Used when converting JSON to CSV. Nested keys become dotted columns.
- `header` (boolean)
- `inferTypes` (boolean): Used when converting CSV to JSON.
- `text` (string, required)

Output parameters:

- `columns` (integer)
- `delimiter` (string)
- `error` (string)
- `ok` (boolean)
- `output` (string)
- `rows` (integer)
- `warning` (string)

### `diff_text` (~85 tokens)

Diff two texts

Compare two texts by line, word, or character, or compare JSON so object key order does not matter. Returns an inline diff, side-by-side rows for line and JSON modes, and a unified patch.

Input parameters:

- `ignoreWhitespace` (boolean)
- `left` (string, required): The original text.
- `mode` (string)
- `right` (string, required): The changed text.

Output parameters:

- `added` (integer)
- `error` (string)
- `ok` (boolean)
- `patch` (string)
- `pieces` (array)
- `removed` (integer)
- `rows` (array)
- `unchanged` (boolean)
- `unit` (string)

### `base64_codec` (~124 tokens)

Encode or decode Base64

Encode UTF-8 text as Base64, or decode Base64 and data URIs. URL-safe output uses - and _ and omits padding. Decode reports the sniffed media type and whether the bytes are UTF-8 text.

Input parameters:

- `action` (string)
- `dataUri` (boolean)
- `mime` (string)
- `text` (string, required): Text to encode, or Base64 or a data URI to decode.
- `urlSafe` (boolean): Encode with the URL-safe alphabet and no padding. Data URIs stay on the standard alphabet.

Output parameters:

- `binary` (boolean)
- `error` (string)
- `filename` (string)
- `mime` (string)
- `ok` (boolean)
- `output` (string)

### `convert_image` (~81 tokens)

Convert an image

Convert an image to JPEG, PNG, WebP, or AVIF. Send base64 or a public URL. Private addresses are refused and the decoded file is capped at 10 MB. Returns the image as base64. HEIC is not decoded here.

Input parameters:

- `file` (object, required): The image. Provide url or data.
- `target` (string)

Output parameters:

- `bytes` (integer)
- `data` (string): Encoded image as base64.
- `extension` (string)
- `filename` (string)
- `height` (integer)
- `mime` (string)
- `source` (string)
- `width` (integer)

### `compress_image` (~107 tokens)

Compress an image

Re-encode an image at a quality from 1 to 100, optionally capping the longest edge. Send base64 or a public URL. Private addresses are refused and the decoded file is capped at 10 MB. Returns the image as base64.

Input parameters:

- `choice` (string)
- `file` (object, required): The image. Provide url or data.
- `maxEdge`: Longest edge in pixels. Omit it to keep the size.
- `quality` (number)

Output parameters:

- `after` (integer)
- `before` (integer)
- `bytes` (integer)
- `data` (string): Compressed image as base64.
- `extension` (string)
- `filename` (string)
- `format` (string)
- `height` (integer)
- `label` (string)
- `mime` (string)
- `quality` (number)
- `savedBytes` (integer)
- `savedPercent` (number)
- `width` (integer)

### `resize_image` (~108 tokens)

Resize an image

Resize an image by pixels or percent. Fit is contain, cover, or stretch. Send base64 or a public URL. Private addresses are refused and the decoded file is capped at 10 MB. Returns the image as base64.

Input parameters:

- `file` (object, required): The image. Provide url or data.
- `fit` (string)
- `height`
- `lockAspect` (boolean)
- `mode` (string)
- `percent` (number)
- `width`

Output parameters:

- `bytes` (integer)
- `data` (string): Resized image as base64.
- `extension` (string)
- `filename` (string)
- `height` (integer)
- `mime` (string)
- `width` (integer)

### `convert_color` (~89 tokens)

Convert a color and check contrast

Convert HEX, RGB, HSL, OKLCH, or CMYK into every format, name the nearest Tailwind token, and report the WCAG 2 contrast ratio against a background.

Input parameters:

- `background` (string): Background used for the WCAG contrast ratio.
- `color` (string, required): HEX, rgb(), hsl(), oklch(), cmyk(), or a CSS color name.

Output parameters:

- `aaLarge` (boolean)
- `aaNormal` (boolean)
- `aaaLarge` (boolean)
- `aaaNormal` (boolean)
- `cmyk` (string)
- `contrastRatio` (number)
- `contrastText` (string)
- `hex` (string)
- `hsl` (string)
- `ok` (boolean)
- `oklch` (string)
- `rgb` (string)
- `tailwind` (string)

### `convert_unix_timestamp` (~153 tokens)

Convert a unix timestamp

Convert epoch seconds, milliseconds, microseconds, or nanoseconds to ISO-8601 and RFC 2822 in an IANA time zone, or convert a calendar time back to epoch.

Input parameters:

- `day` (integer)
- `hour` (integer)
- `input` (string): Unix timestamp, ISO-8601, RFC 2822, or now. Leave it empty when year, month, and day are set.
- `minute` (integer)
- `month` (integer)
- `second` (integer)
- `timeZone` (string): IANA time zone, such as UTC or America/New_York.
- `unit` (string)
- `year` (integer)

Output parameters:

- `alternateIsoUtc` (string)
- `isoLocal` (string)
- `isoUtc` (string)
- `milliseconds` (string)
- `offset` (string)
- `relative` (string)
- `rfc2822` (string)
- `seconds` (string)
- `timeZone` (string)
- `unit` (string)
- `weekday` (string)

### `date_difference` (~151 tokens)

Difference between two dates

Count calendar days, elapsed time, and business days between two dates. Business days skip weekends and any YYYY-MM-DD holidays you list.

Input parameters:

- `endDate` (string, required): End date as YYYY-MM-DD.
- `endTime` (string): End time as HH:MM or HH:MM:SS. Defaults to midnight.
- `holidays` (string): Weekday holidays to exclude from business days, one YYYY-MM-DD per line.
- `includeEnd` (boolean): Count the end date as well as the days between.
- `startDate` (string, required): Start date as YYYY-MM-DD.
- `startTime` (string): Start time as HH:MM or HH:MM:SS. Defaults to midnight.

Output parameters:

- `businessDays` (integer)
- `countedDays` (integer)
- `days` (integer)
- `extraDays` (integer)
- `holidayDays` (integer)
- `hours` (integer)
- `minutes` (integer)
- `months` (integer)
- `seconds` (integer)
- `sign` (integer)
- `totalDays` (integer)
- `totalHours` (string)
- `weekendDays` (integer)
- `weeks` (integer)
- `years` (integer)

### `hash_data` (~119 tokens)

Hash text or bytes

Compute MD5, SHA-1, SHA-256, and SHA-512 for UTF-8 text or base64 bytes. Pass hmacKey for HMAC and expected to see which digest matches.

Input parameters:

- `base64` (string): Raw bytes as standard base64.
- `expected` (string): Hex or base64 digest to compare.
- `hmacKey` (string): UTF-8 HMAC key. Omit it for a plain digest.
- `text` (string): UTF-8 text to hash. Use this or base64.

Output parameters:

- `hashes` (array)
- `hmac` (boolean)
- `matches` (array)

### `generate_uuid` (~78 tokens)

Generate or inspect a UUID

Generate UUID version 4 or version 7 from cryptographic randomness, up to 10,000 at once, or inspect the version, variant, and v7 timestamp.

Input parameters:

- `action` (string)
- `count` (integer)
- `value` (string): UUID to inspect when action is inspect.
- `version` (string)

Output parameters:

- `ids` (array)
- `timestamp` (string)
- `variant` (string)
- `version`

### `url_codec` (~69 tokens)

Encode, decode, or parse a URL

Percent-encode or decode text, or parse a URL into its host, path, hash, and query parameters.

Input parameters:

- `action` (string)
- `mode` (string)
- `plusAsSpace` (boolean): When decoding, treat + as a space.
- `value` (string, required)

Output parameters:

- `hash` (string)
- `hostname` (string)
- `params` (array)
- `pathname` (string)
- `port` (string)
- `protocol` (string)
- `query` (string)
- `username` (string)
- `value` (string)

### `generate_password` (~123 tokens)

Generate a password or passphrase

Generate cryptographic passwords or EFF-wordlist passphrases and report the entropy in bits. Randomness comes from the platform CSPRNG.

Input parameters:

- `capitalize` (boolean)
- `count` (integer)
- `digit` (boolean)
- `digits` (boolean)
- `excludeAmbiguous` (boolean)
- `length` (integer)
- `lowercase` (boolean)
- `separator` (string)
- `style` (string)
- `symbols` (boolean)
- `uppercase` (boolean)
- `words` (integer)

Output parameters:

- `bits` (number)
- `label` (string)
- `score` (integer)
- `values` (array)

### `explain_chmod` (~75 tokens)

Explain a chmod mode

Convert an octal or symbolic file mode into octal, symbolic notation, and a chmod command, including setuid, setgid, and the sticky bit.

Input parameters:

- `mode` (string, required): Octal such as 755 or 4755, or symbolic such as rwxr-xr-x.
- `path` (string)

Output parameters:

- `command` (string)
- `octal` (string)
- `setgid` (boolean)
- `setuid` (boolean)
- `sticky` (boolean)
- `symbolic` (string)

### `merge_pdf` (~56 tokens)

Merge PDF files

Combine PDF files. Each file is base64 or a public URL, and can keep a page range such as 1-3,5. Private addresses are refused. Returns one PDF as base64.

Input parameters:

- `files` (array, required)

Output parameters:

- `bytes` (integer)
- `data` (string): Merged PDF as base64.
- `pageCount` (integer)

### `split_pdf` (~172 tokens)

Split a PDF

Extract a page range into one PDF, or split into single pages or chunks of N. Send base64 or a public URL. Private addresses are refused. Returns PDF base64 and a ZIP when there are several files.

Input parameters:

- `data` (string): PDF bytes as base64 or a data URI. Decoded size is capped at 10 MB. Provide data or url.
- `every` (integer): Used when mode is chunks.
- `filename` (string)
- `mimeType` (string)
- `mode` (string)
- `name` (string)
- `range` (string): Pages to keep, such as 1-3,5. Blank keeps every page.
- `url` (string): Public URL of a PDF. Private and local addresses are refused. Provide data or url.

Output parameters:

- `files` (array)
- `pageCount` (integer)
- `zip` (string|null): ZIP of the PDFs when there is more than one, otherwise null.

### `compress_pdf` (~150 tokens)

Compress a PDF

Recompress embedded images in a PDF. Presets are light, medium, and strong. Send base64 or a public URL. Private addresses are refused. An optional target size tries harder. Returns the PDF and the sizes before and after.

Input parameters:

- `data` (string): PDF bytes as base64 or a data URI. Decoded size is capped at 10 MB. Provide data or url.
- `filename` (string)
- `mimeType` (string)
- `preset` (string)
- `targetBytes`: Optional size ceiling in bytes, such as 102400.
- `url` (string): Public URL of a PDF. Private and local addresses are refused. Provide data or url.

Output parameters:

- `after` (integer)
- `before` (integer)
- `data` (string): PDF bytes as base64. The original is returned when compression would grow the file.
- `images` (integer)
- `keptOriginal` (boolean)
- `metTarget` (boolean)
- `note` (string)
- `pages` (integer)
- `percent` (number)
- `recompressed` (integer)
- `saved` (integer)

### `images_to_pdf` (~92 tokens)

Build a PDF from images

Turn images, sent as base64 or public URLs in order, into one PDF. JPEG and PNG are embedded directly. Other formats are converted to PNG first. Page size is A4, Letter, or fit. Private addresses are refused. Returns the PDF as base64.

Input parameters:

- `images` (array, required)
- `margin` (number)
- `orientation` (string)
- `page` (string)

Output parameters:

- `bytes` (integer)
- `data` (string): PDF bytes as base64.
- `pageCount` (integer)

### `generate_qr_code` (~115 tokens)

Generate a QR code

Build a static QR code for text, a URL, Wi-Fi, or a vCard. Returns the payload, an SVG string, and a PNG as base64.

Input parameters:

- `dark` (string)
- `ecc` (string)
- `light` (string)
- `margin` (integer)
- `size` (integer)
- `text` (string)
- `type` (string)
- `url` (string)
- `vcard` (object)
- `wifi` (object)

Output parameters:

- `payload` (string)
- `pngBase64` (string)
- `svg` (string)

### `extract_pdf_text` (~123 tokens)

Extract PDF text

Read the selectable text layer of a PDF. Returns per-page text, markdown-style headings, and an o200k token count. Does not OCR scans. Send base64 or a public URL. Private addresses are refused.

Input parameters:

- `data` (string): PDF bytes as base64 or a data URI. Decoded size is capped at 10 MB. Provide data or url.
- `filename` (string)
- `mimeType` (string)
- `url` (string): Public URL of a PDF. Private and local addresses are refused. Provide data or url.

Output parameters:

- `emptyPages` (integer)
- `markdown` (string)
- `pageCount` (integer)
- `pages` (array)
- `text` (string)
- `tokens` (integer)

### `organize_pdf` (~142 tokens)

Organize PDF pages

Reorder, rotate, or drop PDF pages. Each entry names a 1-based source page and a rotation of 0, 90, 180, or 270. The same page may be listed twice. Send base64 or a public URL. Private addresses are refused.

Input parameters:

- `data` (string): PDF bytes as base64 or a data URI. Decoded size is capped at 10 MB. Provide data or url.
- `filename` (string)
- `mimeType` (string)
- `pages` (array, required)
- `url` (string): Public URL of a PDF. Private and local addresses are refused. Provide data or url.

Output parameters:

- `bytes` (integer)
- `data` (string): Organized PDF as base64.
- `pageCount` (integer)

### `render_pdf_pages` (~212 tokens)

Render PDF pages

Render PDF pages to PNG or JPEG. DPI is 72 to 216. A page range such as 1-3,5 is optional. At most 24 pages and 25 MB of images. Send base64 or a public URL. Private addresses are refused. Returns image base64 and a ZIP when there is more than one page.

Input parameters:

- `data` (string): PDF bytes as base64 or a data URI. Decoded size is capped at 10 MB. Provide data or url.
- `dpi` (integer)
- `filename` (string)
- `format` (string)
- `mimeType` (string)
- `quality` (integer): JPEG quality from 1 to 100. Ignored for PNG.
- `range` (string): Pages to render, such as 1-3,5. Blank renders every page, up to 24.
- `url` (string): Public URL of a PDF. Private and local addresses are refused. Provide data or url.

Output parameters:

- `images` (array)
- `pageCount` (integer)
- `zip` (string|null): ZIP of the images when there is more than one, otherwise null.

### `protect_pdf` (~199 tokens)

Protect or unlock a PDF

Protect a PDF with AES-256, or unlock one when the password is known. action is protect or unlock. password is the user password. ownerPassword is optional. permissions cover printing, copying, modifying, annotating, filling forms, accessibility, and assembly. Send base64 or a public URL. Private addresses are refused.

Input parameters:

- `action` (string)
- `data` (string): PDF bytes as base64 or a data URI. Decoded size is capped at 10 MB. Provide data or url.
- `filename` (string)
- `mimeType` (string)
- `ownerPassword` (string): Owner password. Blank uses the user password.
- `password` (string): User password. Required to protect or unlock. Unlock only works when this is the known password.
- `permissions` (object)
- `url` (string): Public URL of a PDF. Private and local addresses are refused. Provide data or url.

Output parameters:

- `bytes` (integer)
- `data` (string): PDF bytes as base64.
- `encrypted` (boolean)

### `convert_markdown_html` (~67 tokens)

Convert Markdown and HTML

Convert GitHub-flavored Markdown to HTML, or HTML to Markdown. to is html or markdown. sanitize strips scripts from the text output. The conversion does not fetch a URL.

Input parameters:

- `sanitize` (boolean)
- `text` (string)
- `to` (string)

Output parameters:

- `direction` (string)
- `output` (string)

### `fetch_page_markdown` (~70 tokens)

Fetch a page as Markdown

Fetch a public HTML page and return the article as Markdown, plus a title, excerpt, and o200k token count. Private and local addresses are refused. The response is capped at 800 KB.

Input parameters:

- `url` (string, required): Public http or https URL. Private and local addresses are refused.

Output parameters:

- `chars` (integer)
- `excerpt` (string)
- `markdown` (string)
- `title` (string)
- `tokens` (integer)
- `url` (string)

### `read_barcode` (~74 tokens)

Read a QR code or barcode

Read QR codes and barcodes from an image. Send base64 or a public URL. Private addresses are refused and the decoded file is capped at 10 MB. Returns each code's text and format. An image with no code returns an empty list.

Input parameters:

- `file` (object, required): The image. Provide url or data.

Output parameters:

- `codes` (array)
- `count` (integer)

### `optimize_svg` (~117 tokens)

Optimize an SVG

Minify an SVG with SVGO. Send markup or a file as base64 or a public URL. Private addresses are refused and the file is capped at 10 MB. The viewBox is kept unless removeViewBox is true. Returns the optimized markup and the byte counts.

Input parameters:

- `file` (object): An SVG file. Provide svg or file.
- `precision` (integer)
- `removeDimensions` (boolean)
- `removeViewBox` (boolean)
- `svg` (string): SVG markup. Provide svg or file.

Output parameters:

- `afterBytes` (integer)
- `beforeBytes` (integer)
- `savedBytes` (integer)
- `savedPercent` (number)
- `svg` (string)

### `read_exif` (~129 tokens)

Read or strip photo metadata

Read EXIF tags, including GPS, or strip them. action is read or strip. scope is all or gps. gps-only removal keeps the other JPEG tags. Other formats are re-encoded, which drops every tag. Send base64 or a public URL. Private addresses are refused and the decoded file is capped at 10 MB.

Input parameters:

- `action` (string)
- `file` (object, required): The photo. Provide url or data.
- `scope` (string): Used when action is strip. gps removes the GPS block from a JPEG. all re-encodes and drops every tag.

Output parameters:

- `bytes` (integer)
- `camera` (string)
- `data` (string): Cleaned image as base64. Empty when action is read.
- `filename` (string)
- `gps`
- `height` (integer)
- `mime` (string)
- `note` (string)
- `stripped` (string)
- `tags` (array)
- `when` (string)
- `width` (integer)

### `crop_image` (~151 tokens)

Crop an image

Crop an image to a pixel box or a 0 to 1 ratio box. circle cuts a round mask. format is png, jpeg, or webp. Send base64 or a public URL. Private addresses are refused and the decoded file is capped at 10 MB. Returns the image as base64.

Input parameters:

- `circle` (boolean)
- `file` (object, required): The image. Provide url or data.
- `format` (string)
- `height` (number)
- `unit` (string): px is source pixels. ratio is a 0 to 1 share of the source.
- `width` (number)
- `x` (number)
- `y` (number)

Output parameters:

- `bytes` (integer)
- `data` (string): Cropped image as base64.
- `extension` (string)
- `filename` (string)
- `height` (integer)
- `mime` (string)
- `width` (integer)

### `generate_favicon` (~147 tokens)

Generate a favicon pack

Build a favicon pack from an image or up to three letters. The ZIP contains favicon.ico, PNG sizes, a web manifest, an HTML snippet, and a Next.js metadata snippet. Letters are drawn with a built-in bitmap font so the result does not depend on a system font. Send base64 or a public URL. Private addresses are refused and the decoded file is capped at 10 MB.

Input parameters:

- `background` (string)
- `color` (string)
- `file` (object): A square-or-any image. Provide file or text.
- `name` (string)
- `text` (string): Up to three letters drawn as the mark. Provide file or text.

Output parameters:

- `bytes` (integer)
- `data` (string): ZIP of the favicon files as base64.
- `filename` (string)
- `html` (string)
- `manifest` (string)
- `mime` (string)
- `nextMetadata` (string)
- `preview` (string): 32 pixel PNG as base64.

### `read_image_text` (~121 tokens)

Read text from an image

Extract text from an image with Tesseract. language defaults to eng. Other codes in the list are fetched when first used. Send base64 or a public URL. Private addresses are refused and the decoded file is capped at 10 MB. Returns the text and a confidence from 0 to 100. An image with no text returns an empty string.

Input parameters:

- `file` (object, required): The image. Provide url or data.
- `language` (string): A Tesseract language code such as eng, spa, fra, deu, or jpn.

Output parameters:

- `confidence` (number)
- `language` (string)
- `text` (string)

### `remove_background` (~173 tokens)

Remove a solid image background

Remove a solid or near-solid background by flood-filling from the border. color is an optional #rrggbb. The portrait model runs in the browser, not in this handler: MODNet is Apache-2.0, RMBG-1.4 is non-commercial, and the ONNX runtime is too large for the serverless function. Send base64 or a public URL. Private addresses are refused and the decoded file is capped at 10 MB. Returns a PNG as base64.

Input parameters:

- `color` (string): Background color as #rgb or #rrggbb. Blank samples the corners.
- `feather` (boolean)
- `file` (object, required): The image. Provide url or data.
- `tolerance` (number): How far a border pixel may be from the background color, in RGB distance.

Output parameters:

- `bytes` (integer)
- `data` (string): PNG with transparency as base64.
- `filename` (string)
- `height` (integer)
- `method` (string)
- `mime` (string)
- `note` (string)
- `width` (integer)

### `count_text` (~43 tokens)

Count words and characters

Count words, code points, graphemes, sentences, and paragraphs, and compare the length with SEO and social limits.

Input parameters:

- `text` (string, required): Text to count.

Output parameters:

- `characters` (integer)
- `charactersNoSpaces` (integer)
- `graphemes` (integer)
- `lines` (integer)
- `paragraphs` (integer)
- `platforms` (array)
- `readingLabel` (string)
- `sentences` (integer)
- `speakingLabel` (string)
- `uniqueWords` (integer)
- `words` (integer)

### `convert_case` (~75 tokens)

Convert text case

Convert text to camelCase, snake_case, kebab-case, CONSTANT_CASE, and AP or Chicago title case. Returns every style unless one is requested.

Input parameters:

- `style` (string): Return one style. Omit it to return every style.
- `text` (string, required): Text to convert. Each line is converted on its own.

Output parameters:

- `cases` (array)

### `generate_fake_data` (~86 tokens)

Generate lorem ipsum or fake rows

Generate seeded lorem ipsum, or fake JSON, CSV, or SQL rows from a list of field types.

Input parameters:

- `count` (integer)
- `fields` (array)
- `format` (string)
- `kind` (string)
- `mode` (string)
- `rows` (integer)
- `seed` (integer)
- `table` (string)

Output parameters:

- `format` (string)
- `output` (string)
- `rows` (integer)

### `test_regex` (~83 tokens)

Test a JavaScript regular expression

Run a JavaScript regular expression against a sample and return every match, capture group, a short explanation, and an optional replacement.

Input parameters:

- `flags` (string)
- `pattern` (string, required): JavaScript regular expression body, without slashes.
- `replacement` (string): When set, the sample is replaced and returned.
- `text` (string, required): Sample to search.

Output parameters:

- `explanation` (array)
- `matches` (array)
- `replacement` (string|null)
- `truncated` (boolean)

### `format_sql` (~72 tokens)

Format SQL

Format SQL for PostgreSQL, MySQL, BigQuery, Snowflake, and other dialects. Choose keyword case and an indent of 2 or 4 spaces.

Input parameters:

- `dialect` (string)
- `indent`
- `keywordCase` (string)
- `sql` (string, required): SQL to format.

Output parameters:

- `sql` (string)

### `validate_json_schema` (~72 tokens)

Infer or validate JSON Schema

Infer a JSON Schema from a sample, or validate JSON against a schema. Returns error paths plus TypeScript and Zod generated from the sample.

Input parameters:

- `json` (string, required): JSON document to infer from or validate.
- `schema` (string): JSON Schema. Omit it to infer a schema from the document.

Output parameters:

- `errors` (array)
- `schema` (string)
- `typescript` (string)
- `valid` (boolean)
- `zod` (string)

### `calculate_emi` (~100 tokens)

Calculate a loan EMI

Calculate a reducing-balance loan installment and its amortization schedule. Money is rounded half up to cents. An optional extra monthly payment reduces principal.

Input parameters:

- `annualRate` (string|number, required): Annual interest rate in percent, such as 10.
- `extraMonthly` (string|number): Extra principal paid every month.
- `months` (integer, required): Term in months.
- `principal` (string|number, required): Amount borrowed, such as 100000.

Output parameters:

- `csv` (string)
- `emi` (string)
- `payoffMonths` (integer)
- `schedule` (array)
- `totalInterest` (string)
- `totalPayment` (string)
- `totalPrincipal` (string)

### `calculate_percentage` (~101 tokens)

Calculate a percentage

Calculate percent of a value, what percent one number is of another, percent change, the reverse, an increase or decrease, and margin versus markup.

Input parameters:

- `a` (string|number, required): First value. For of and increase, this is the percent.
- `b` (string|number, required): Second value. For of and increase, this is the amount.
- `mode` (string): of, is, change, reverse, increase, decrease, or margin.

Output parameters:

- `formula` (string)
- `parts` (array)
- `result` (string)
- `unit` (string)

### `convert_units` (~108 tokens)

Convert units

Convert length, mass, volume, temperature, area, speed, time, and data size. Decimal bytes (kB, MB) and binary bytes (KiB, MiB) are separate categories.

Input parameters:

- `category` (string, required)
- `from` (string, required): Source unit id, such as m, C, MB, or MiB.
- `precision` (integer)
- `to` (string, required): Target unit id from the same category.
- `value` (string|number, required)

Output parameters:

- `result` (string)
- `rows` (array)

### `lookup_dns` (~106 tokens)

Look up DNS records

Query A, AAAA, MX, TXT, CNAME, and CAA for a public hostname over DNS-over-HTTPS, and parse SPF and DMARC. Private names are refused. The resolver is Cloudflare or Google.

Input parameters:

- `mail` (boolean): Also fetch the _dmarc TXT record and parse SPF.
- `name` (string, required): Public hostname, such as example.com. Private names are refused.
- `resolver` (string)
- `types` (array)

Output parameters:

- `dmarc`
- `name` (string)
- `queries` (array)
- `records` (array)
- `resolver` (string)
- `spf`

### `calculate_cidr` (~144 tokens)

Calculate a CIDR block

Return the network, broadcast, host range, and host count for an IPv4 or IPv6 CIDR. Optionally test whether an address is inside it, split it, or merge it with other CIDRs.

Input parameters:

- `cidr` (string, required): IPv4 or IPv6 CIDR, such as 192.168.1.0/24 or 2001:db8::/32. A dotted mask may follow the address.
- `contains` (string): Address to test for membership.
- `merge` (array): Extra CIDRs to aggregate with cidr.
- `splitPrefix` (integer): Longer prefix to split into, at most 256 networks.

Output parameters:

- `contains` (boolean|null)
- `containsDetail` (string)
- `merged` (array)
- `split` (array)
- `splitCount` (string)
- `summary` (object)

### `hash_password` (~184 tokens)

Hash or verify a password

Hash a password with bcrypt or argon2id, or verify a hash. Returns an htpasswd line when a username is set. The password is not stored or logged. The page in the browser never sends the password; this call only hashes the arguments you send.

Input parameters:

- `algorithm` (string)
- `cost` (integer): Bcrypt cost factor, from 4 to 12.
- `hash` (string): Existing bcrypt or argon2id hash. When set, the password is verified instead of hashed.
- `iterations` (integer)
- `memory` (integer): Argon2id memory in KiB.
- `parallelism` (integer)
- `password` (string, required): Password to hash or verify. It is used only for this call and is not stored.
- `username` (string): Optional htpasswd username. A colon is not allowed.

Output parameters:

- `algorithm` (string)
- `hash` (string)
- `htpasswd` (string)
- `verified` (boolean|null)

### `generate_keypair` (~123 tokens)

Generate or convert a key pair

Generate an RSA, EC, or Ed25519 key pair as PEM and JWK, or convert between PEM and JWK. The private key is returned in the result and is not stored. The page in the browser generates keys locally and does not send them.

Input parameters:

- `action` (string)
- `alg` (string)
- `jwk` (string): JWK JSON to convert. Required for to_pem.
- `modulusLength`
- `pem` (string): SPKI or PKCS8 PEM to convert. Required for to_jwk.

Output parameters:

- `alg` (string)
- `jwks` (string)
- `privateJwk` (string)
- `privatePem` (string)
- `publicJwk` (string)
- `publicPem` (string)

### `build_csp` (~95 tokens)

Build a Content-Security-Policy

Build a Content-Security-Policy from directives, or lint an existing policy. Returns the header line, a Next.js headers() snippet, and warnings for unsafe sources.

Input parameters:

- `blockAllMixedContent` (boolean)
- `policy` (string): An existing Content-Security-Policy value to lint. When set, directive fields are ignored.
- `sources` (object)
- `upgradeInsecureRequests` (boolean)

Output parameters:

- `checks` (array)
- `header` (string)
- `nextConfig` (string)
- `policy` (string)

### `validate_sitemap` (~119 tokens)

Validate or generate a sitemap

Validate sitemap XML or a public sitemap URL, including a sitemap index and a sample of HTTP statuses. Or generate a urlset from a list of URLs. Private addresses are refused and responses are size-capped.

Input parameters:

- `probe` (boolean): Request a sample of locations and report HTTP status.
- `url` (string): Public sitemap URL. Private addresses are refused.
- `urls` (array): URLs to place in a generated sitemap. When set, url and xml are ignored.
- `xml` (string): Sitemap XML. Use this or url.

Output parameters:

- `issues` (array)
- `kind` (string)
- `probes` (array)
- `sitemapCount` (number)
- `sitemaps` (array)
- `source` (string)
- `urlCount` (number)
- `urls` (array)
- `xml` (string)

### `check_http_headers` (~68 tokens)

Check HTTP response headers

Fetch a public URL, follow redirects, and grade HSTS, Content-Security-Policy, framing, nosniff, and Referrer-Policy. Private addresses are refused. The body is not stored.

Input parameters:

- `url` (string, required): Public http or https URL. Private addresses are refused.

Output parameters:

- `checks` (array)
- `elapsedMs` (number)
- `finalUrl` (string)
- `grade` (string)
- `headers` (array)
- `redirects` (array)
- `status` (number)

### `check_ssl` (~69 tokens)

Check a TLS certificate

Connect to a public host on port 443 and report certificate expiry, subject alternative names, protocol, and chain. Private addresses are refused. The handshake times out after 8 seconds.

Input parameters:

- `host` (string, required): Public hostname or https URL. Only port 443 is contacted. Private addresses are refused.

Output parameters:

- `authorizationError` (string)
- `authorized` (boolean)
- `bits` (number|null)
- `chain` (array)
- `checks` (array)
- `commonName` (string)
- `daysRemaining` (number|null)
- `fingerprint` (string)
- `grade` (string)
- `host` (string)
- `issuer` (string)
- `protocol` (string)
- `sans` (array)
- `serial` (string)
- `subject` (string)
- `validFrom` (string)
- `validTo` (string)

### `generate_totp` (~117 tokens)

Generate a TOTP/HOTP one-time code

Compute RFC 4226/6238 one-time passcodes from a base32 secret. Supports 6/8 digits, SHA1/SHA256/SHA512, and custom periods.

Input parameters:

- `algorithm` (string)
- `at` (integer): Unix time in milliseconds; defaults to now
- `counter` (integer): HOTP counter
- `digits`
- `mode` (string)
- `period` (integer): TOTP period in seconds
- `secret` (string, required): Base32 TOTP/HOTP secret

Output parameters:

- `algorithm` (string)
- `code` (string)
- `digits` (integer)
- `mode` (string)
- `period` (integer)
- `secondsRemaining`

### `query_jsonpath` (~91 tokens)

Run a JSONPath query

Evaluate a JSONPath Plus query against a JSON document and return the matches with their paths. A number that does not fit in a JavaScript number is returned as its original digits, with a precision warning.

Input parameters:

- `json` (string, required): JSON document text
- `limit` (integer): Maximum matches to return
- `query` (string, required): JSONPath query, e.g. $.store.book[*].author

Output parameters:

- `count` (integer)
- `matches` (array)
- `truncated` (boolean)
- `warning` (string)

### `calculate_programmer` (~133 tokens)

Evaluate a programmer expression

Evaluate integer expressions with C-like precedence (hex/octal/binary literals, bitwise ops, shifts) and report base conversions plus signed/unsigned interpretations.

Input parameters:

- `a` (string): First operand, e.g. '0xFF' or '255'
- `b` (string): Second operand (not needed for 'not')
- `bits` (string): Bit width for masking and signed interpretation
- `expression` (string): Integer expression, e.g. '0xFF & 0x0F | (1 << 4)'
- `op` (string): Bitwise operation (alternative to expression)

Output parameters:

- `binary` (string)
- `bits` (integer)
- `decimal` (string)
- `hex` (string)
- `octal` (string)
- `signed` (string)
- `unsigned` (string)

### `aes_crypt` (~98 tokens)

Encrypt or decrypt with AES-GCM

AES-256-GCM encryption with PBKDF2-SHA256 key derivation. Encrypt returns a base64 bundle (salt, IV, ciphertext); decrypt reverses it.

Input parameters:

- `bundle` (string): Base64 bundle from a previous encryption (decrypt mode)
- `iterations` (integer)
- `mode` (string, required)
- `passphrase` (string, required)
- `text` (string): Plaintext to encrypt (encrypt mode)

Output parameters:

- `bundle` (string)
- `mode` (string)
- `plaintext` (string)

### `analyze_har` (~73 tokens)

Analyze a HAR file

Parse a HAR (HTTP Archive) capture and summarize it: request counts, status distribution, slowest and largest requests, top hosts, and per-request timings.

Input parameters:

- `har` (string, required): HAR file contents as JSON text
- `top` (integer): How many slowest/largest requests and top hosts to include

Output parameters:

- `largest` (array)
- `slowest` (array)
- `statusGroups` (object)
- `topHosts` (array)
- `totalBytes` (integer)
- `totalRequests` (integer)
- `totalTimeMs` (number)
- `truncated` (boolean)

### `convert_json_to_types` (~61 tokens)

Convert JSON to type definitions

Infer types from a JSON document and generate TypeScript interfaces, Zod schemas, Python Pydantic models or dataclasses, and Go structs.

Input parameters:

- `json` (string, required)
- `rootName` (string)
- `targets` (array)

Output parameters:

- `outputs` (object)
- `warnings` (array)

### `minify_code` (~84 tokens)

Minify JavaScript, CSS, or HTML

Minify source code with Terser (JS), csso (CSS), or a structural HTML pass and report before/after byte counts.

Input parameters:

- `code` (string, required)
- `cssLevel`
- `htmlAggressive` (boolean)
- `jsCompress` (boolean)
- `jsMangle` (boolean)
- `language` (string, required)

Output parameters:

- `afterBytes` (integer)
- `beforeBytes` (integer)
- `code` (string)
- `savedBytes` (integer)
- `savedPct` (number)

### `convert_curl` (~45 tokens)

Convert a curl command to code

Parse a curl command and generate equivalent JavaScript fetch, Python requests, Go, PHP, or Rust code.

Input parameters:

- `command` (string, required)
- `target` (string)

Output parameters:

- `body` (string)
- `headers` (array)
- `method` (string)
- `snippet` (string)
- `url` (string)
- `warnings` (array)

### `execute_graphql` (~87 tokens)

Execute a GraphQL query

Send a GraphQL query with optional variables and headers to a public http or https endpoint on port 80 or 443 and return the response data or errors. Local, private, and internal addresses are refused.

Input parameters:

- `endpoint` (string, required)
- `headers` (object)
- `query` (string, required)
- `timeoutMs` (integer)
- `variables` (object)

Output parameters:

- `data`
- `durationMs` (number)
- `error` (string)
- `errors`
- `ok` (boolean)
- `status` (integer)

### `validate_websocket_url` (~50 tokens)

Validate a WebSocket URL

Validate and parse a ws:// or wss:// URL into its components, and optionally decode a WebSocket close code.

Input parameters:

- `explainCloseCode` (integer)
- `url` (string, required)

Output parameters:

- `closeCode` (string)
- `error` (string)
- `host` (string)
- `path` (string)
- `port` (integer)
- `protocol` (string)
- `secure` (boolean)
- `valid` (boolean)

### `generate_resume` (~71 tokens)

Generate a resume PDF

Build a resume PDF from profile, experience, education, and skills. A name plus at least one experience, education, or skills entry is required. Choose the clean, modern, or compact template. Returns the A4 PDF as base64.

Input parameters:

- `resume` (object, required)
- `template` (string)

Output parameters:

- `bytes` (integer)
- `data` (string): Resume PDF as base64.
- `pageCount` (integer)

### `generate_invoice` (~72 tokens)

Generate an invoice or quote PDF

Build an invoice or quote PDF from company and client details, line items with quantities and rates, a tax rate, and an optional percent or flat discount. All money is computed in integer cents, so there are no float rounding errors. Returns the PDF as base64 plus the total.

Input parameters:

- `invoice` (object, required)

Output parameters:

- `bytes` (integer): PDF size in bytes.
- `currency` (string): ISO currency code used for the invoice.
- `data` (string): Invoice or quote PDF as base64.
- `totalCents` (integer): Grand total in integer cents.

### `sign_pdf` (~99 tokens)

Sign a PDF with a PNG signature

Stamp a PNG signature image onto one or more PDF pages at given positions (fractions of the page, x and y measured from the top-left, width as a fraction of page width). The signature keeps its aspect ratio. Returns the signed PDF as base64.

Input parameters:

- `file` (object, required): The PDF to sign.
- `placements` (array, required)
- `signature` (object, required): The signature as a PNG image, base64 or a public URL.

Output parameters:

- `bytes` (integer)
- `data` (string): Signed PDF as base64.
- `pageCount` (integer)

### `resize_social_image` (~157 tokens)

Resize an image to social media dimensions

Crop and resize an image to an exact social media preset: instagram-post (1080x1080), instagram-portrait (1080x1350), instagram-story (1080x1920), youtube-thumbnail (1280x720), x-post (1200x675), x-header (1500x500), linkedin-post (1200x627), or facebook-post (1200x630). The cover crop keeps the center subject. Send base64 or a public URL. Private addresses are refused and the decoded file is capped at 10 MB. Returns the image as base64 PNG.

Input parameters:

- `file` (object, required): The image. Provide url or data.
- `preset` (string, required): Social platform preset with exact pixel dimensions.

Output parameters:

- `bytes` (integer)
- `data` (string): Resized image as base64 PNG.
- `height` (integer)
- `width` (integer)

### `trim_audio` (~118 tokens)

Trim a WAV audio file

Trim a WAV audio file to a time range with optional fade in and out, returning a 16-bit PCM WAV as base64. Only WAV is accepted; the web UI handles MP3/OGG/M4A.

Input parameters:

- `endSec` (number, required): Trim end in seconds, after startSec.
- `fadeInSec` (number): Linear fade-in length in seconds.
- `fadeOutSec` (number): Linear fade-out length in seconds.
- `file` (object, required)
- `startSec` (number, required): Trim start in seconds.

Output parameters:

- `bytes` (integer): WAV file size in bytes.
- `data` (string): Trimmed audio as a 16-bit PCM WAV, base64.
- `durationSec` (number): Duration of the trimmed audio in seconds.
- `sampleRate` (integer): Sample rate in Hz.

### `convert_currency` (~87 tokens)

Convert an amount between currencies

Convert money between ISO 4217 currencies using live exchange rates from the Frankfurter API, fetched through the SSRF-safe outbound guard. Supports historical dates.

Input parameters:

- `amount` (number)
- `date` (string): Historical date; omit for the latest rates.
- `from` (string): ISO 4217 currency code.
- `to` (string): ISO 4217 currency code.

Output parameters:

- `amount` (number)
- `date` (string)
- `error` (string)
- `from` (string)
- `ok` (boolean)
- `rate` (number)
- `result` (number)
- `to` (string)

### `generate_meme` (~161 tokens)

Generate a meme image

Render a classic top/bottom-caption meme as a PNG. Give it an image (base64, data URI, or public URL) or pick a gradient style, and it returns captioned meme artwork.

Input parameters:

- `bottom` (string)
- `fontScale` (number): Caption size multiplier.
- `image` (object): Base image as base64, a data URI, or a public URL. Private addresses are refused. 10 MB cap. Omit to use a gradient style background.
- `styleId` (string): Gradient style id when no image is given: sunset, ocean, grape, forest, mono, candy. Default: sunset.
- `top` (string)
- `upper` (boolean): Uppercase captions, classic meme style.

Output parameters:

- `height` (integer)
- `mimeType` (string)
- `png` (string): PNG bytes, base64 encoded.
- `width` (integer)

### `zip_files` (~70 tokens)

Zip files or unzip an archive

Create a ZIP archive from files or list and extract the contents of a ZIP archive. Everything is handled in memory; no files are stored.

Input parameters:

- `archive` (object): Archive to extract (unzip mode).
- `files` (array): Files to zip (zip mode).
- `mode` (string)

Output parameters:

- `fileCount` (integer)
- `files` (array): Extracted files (unzip mode).
- `mode` (string)
- `totalBytes` (integer)
- `zip` (string): Base64 ZIP bytes (zip mode).

### `make_collage` (~143 tokens)

Make a photo collage

Arrange up to 9 photos into a collage layout (duo, trio, focus, quad, six, nine) with a gap and background color, and get back a square PNG.

Input parameters:

- `background` (string)
- `gap` (integer): Gap between cells in pixels.
- `images` (array, required): Photos as base64, data URIs, or public URLs. Private addresses are refused. 10 MB cap each.
- `layout` (string): Layout id: duo, duo-stack, trio, focus, quad, six, nine. Unknown ids fall back to quad.
- `width` (integer): Output width in pixels; the collage is square.

Output parameters:

- `cells` (integer): Cells in the layout; cells beyond the image count stay background-colored.
- `height` (integer)
- `mimeType` (string)
- `png` (string): PNG bytes, base64 encoded.
- `width` (integer)

### `fill_pdf_form` (~136 tokens)

Fill a PDF form

Fill an interactive PDF form's text fields, checkboxes, dropdowns, and radios by field name, with an option to flatten the result. Pass inspectOnly to list the fields first.

Input parameters:

- `file` (object, required): PDF as base64, a data URI, or a public URL. Private addresses are refused. 10 MB cap.
- `flatten` (boolean): Flatten the form so fields become plain page content.
- `inspectOnly` (boolean): List the form fields without changing anything.
- `values` (object): Field name to value. Checkboxes take booleans; dropdowns and radios take one of their options.

Output parameters:

- `fields` (array): Detected form fields (inspectOnly).
- `filled` (integer)
- `mimeType` (string)
- `pageCount` (integer)
- `pdf` (string): Filled PDF bytes, base64 encoded.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/fabwaseem-benchline/benchline#diagnostics

## Score history

- 2026-11-04: 18
- 2026-11-03: 18
- 2026-11-02: 18
- 2026-11-01: 18
- 2026-10-31: 18
- 2026-10-30: 18
- 2026-10-29: 18
- 2026-10-28: 18
- 2026-10-27: 18
- 2026-10-26: 18
- 2026-10-25: 18
- 2026-10-24: 18
- 2026-10-23: 62
- 2026-10-22: 61
- 2026-10-21: 61
- 2026-10-20: 60
- 2026-10-19: 60

## Common questions

### What is the Benchline MCP server?

Benchline is an MCP server listed in the public MCP registry as io.github.fabwaseem/benchline. Open-source developer, PDF, image, SEO and security tools over a stateless HTTP MCP server. No key. This page covers its hosted endpoint (https://benchline.fabwaseem.com/mcp).

### What tools does the Benchline MCP server expose?

Benchline exposes 82 tools: generate_llms_txt, score_ai_seo, build_open_graph, list_og_templates, decode_jwt, and 77 more. Their descriptions and schemas cost roughly 8,833 tokens of context every time the server is loaded.

### Does the Benchline MCP server require authentication?

Its publisher declares no required credentials for Benchline. We have not been able to confirm that against the live endpoint, and a server can require authorisation without declaring it here.

### Is the Benchline MCP server still maintained?

Benchline is still listed in the MCP registry, though our most recent checks did not reach this channel. We last reached this channel on 3 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://benchline.fabwaseem.com/mcp
- Repository: https://github.com/fabwaseem/benchline
- Website: https://benchline.fabwaseem.com/mcp/guide
- Changelog RSS feed: https://verifymcp.io/servers/fabwaseem-benchline/benchline.xml
- Changelog JSON feed: https://verifymcp.io/servers/fabwaseem-benchline/benchline.json
- HTML version of this page: https://verifymcp.io/servers/fabwaseem-benchline/benchline
