Skip to main content
Glama

Benchline is a free directory of browser tools for the small, exact jobs around shipping software: JSON, PDFs, images, tokens, headers, and the files a crawler can cite. Each tool is a pure function with a page on the site and the same function on a stateless MCP server. Nothing is stored. A tool runs in the browser unless its job is to read a public URL.

Live: https://tools.fabwaseem.com

Screenshots

The directory is the home page. The JSON formatter is one tool page (/t/json-formatter).

Related MCP server: mcp-server-devutils

Features

  • A searchable directory, with categories, tags, and a command palette on ⌘K. Filtering runs in the browser.

  • One folder per tool: metadata, a client page, and pure lib/ covered by vitest.

  • A stateless Streamable HTTP MCP server at /mcp. No API key and no session.

  • The same functions over HTTP at POST /api/v1/tools/<slug>, with an OpenAPI document at /openapi.json.

  • /llms.txt and /llms-full.txt, generated from the registry.

  • Light and dark themes. Corner radii stay on the small token scale.

Tools

71 tools, in toolOrder. Run pnpm gen:readme-tools after adding one.

Developer

Build files, schedules, and the small programs a deploy depends on.

Cron. Build a cron expression and read the next runs.

Next.js. Production files for shipping a Next.js app in a container.

Fixtures. Placeholder copy and seeded rows for a schema.

  • Lorem ipsum — Placeholder copy, or fake rows as JSON, CSV, and SQL, from a seed.

Regex. Test a JavaScript regular expression against a sample.

  • Regex tester — Test a JavaScript pattern, read the groups, and preview a replacement.

Code. Minify and convert source code.

  • Code Minifier — Minify JavaScript, CSS, and HTML with byte-level savings.

Data & Formats

JSON, tables, and the encodings that move data between systems.

JSON. Format JSON and convert it to YAML.

  • JSON formatter — Pretty-print, minify, and validate JSON, with the exact line and column when it fails.

  • JSON YAML converter — Convert JSON, YAML, TOML, and XML in the browser, and keep the line number when a document fails.

  • JSON Schema — Infer a schema from JSON, validate against one, and export TypeScript and Zod.

  • JSONPath tester — Query JSON with JSONPath Plus and inspect every match.

  • JSON to Types — Paste JSON, get TypeScript, Zod, Pydantic, dataclass, and Go types.

Tables. Turn CSV into JSON and JSON into rows.

  • CSV JSON converter — Convert CSV to JSON and JSON back to CSV, with a delimiter and a header row you choose.

Encoding. Base64 and the bytes a string is hiding.

  • Base64 codec — Encode and decode Base64 for text or a file, including the URL-safe alphabet.

  • Programmer calculator — Base conversions, bitwise ops, and a clickable bit grid.

Markup. Markdown and HTML, converted in either direction.

  • Markdown HTML — Convert Markdown to HTML, or HTML back to Markdown, with a live preview.

SQL. Format a query without running it.

  • SQL formatter — Format SQL for PostgreSQL, MySQL, BigQuery, Snowflake, and other dialects.

Markup, crawlers, and the files an AI search engine can cite.

AI search. Files and checks that decide what an AI crawler can fetch, cite, and skip.

  • llms.txt generator — Read a public sitemap and write an llms.txt index, plus an optional llms-full.txt.

  • AI SEO checker — Score crawler access, llms.txt, structured data, and the on-page signals AI search uses.

  • robots.txt checker — Read allow and disallow rules, sitemap links, and the mistakes that make a robots.txt file lie.

  • Page to Markdown — Fetch a public page and turn the article into Markdown.

SEO. Structured data and the markup a crawler can quote without guessing.

AI dev. Token counts and the cost of a prompt before you send it.

  • AI token counter — Count tokens and estimate the API cost of a prompt for GPT, Claude, and Gemini models.

Social previews. Open Graph cards, meta tags, and the picture a shared link unfurls into.

  • OG image generator — Pick a template, watch the card update, then download the PNG or copy the Next.js file.

  • Meta tags inspector — Read title, description, canonical, robots, Open Graph, Twitter, and JSON-LD types from one public URL.

Image & Media

Convert, compress, and resize pictures in the browser. The file stays on the device.

  • Image format converter — Convert HEIC, WebP, PNG, JPG, and AVIF in the browser. Nothing is uploaded.

  • Image compressor — Shrink JPEG, PNG, WebP, and AVIF in the browser, with the real before and after size.

  • Image resizer — Resize by pixels or percent, with the aspect ratio locked and a batch ZIP.

  • QR and barcode reader — Read QR codes and barcodes from a photo, a paste, or the camera.

  • SVG optimizer — Minify an SVG, compare the size, and keep the viewBox unless you turn that off.

  • EXIF viewer and remover — Read photo metadata, including GPS, and strip all of it or only the location.

  • Image cropper — Crop with a free box or an aspect preset, including a circle.

  • Image to text — Read the words in a picture. The OCR model downloads once and runs in this browser.

  • Background remover — Cut out a portrait in the browser, or clear a solid backdrop without a download.

PDF & Documents

Merge, split, compress, and build PDFs in the browser. The files stay on this device.

  • Merge PDF — Combine PDFs in the browser. Reorder them, keep a page range from each file, and download one document.

  • Split PDF — Extract a page range, or split a PDF into single pages or chunks, then download a PDF or a ZIP.

  • Compress PDF — Shrink a PDF in the browser. Pick a preset or a target size and compare the file before and after.

  • Image to PDF — Turn JPG, PNG, and WebP images into one PDF. Set the page size, orientation, margin, and order.

  • PDF to Text — Read the selectable text of a PDF, with a markdown heading when the type is larger.

  • Rotate PDF — Reorder, rotate, or drop pages, then download the PDF.

  • PDF to Image — Render PDF pages to PNG or JPEG, then download one image or a ZIP.

  • Protect PDF — Add an AES password, or unlock a PDF when you already know the password.

Security & Crypto

Tokens, hashes, passwords, and the bits a permission is made of.

Auth debugging. Read a JSON Web Token, check the signature, and see why a session expired.

  • JWT decoder — Paste a JSON Web Token, read the claims, and verify the signature in the browser.

  • TOTP authenticator — Live 2FA codes for your accounts, with otpauth:// import and QR export.

Crypto. Hashes, passwords, UUIDs, and permission bits.

  • Hash generator — MD5, SHA-1, SHA-256, and SHA-512 checksums for text or a file, with HMAC.

  • UUID generator — Generate UUID v4 or v7 in bulk, and read the time stored in a v7 id.

  • Password generator — Cryptographic passwords and passphrases, with an entropy strength meter.

  • Chmod calculator — Turn a permission grid into octal and symbolic chmod, and back.

  • Bcrypt hash — Hash and verify passwords with bcrypt or argon2id. Nothing is stored.

  • Key pair — Generate RSA, EC, and Ed25519 keys, and convert PEM and JWK.

  • AES encryption — AES-GCM encrypt and decrypt in the browser, nothing uploaded.

Headers. Content-Security-Policy and the headers a browser enforces.

  • CSP builder — Build a Content-Security-Policy and a Next.js headers snippet.

Design

Color values, contrast, and the marks a layout is built from.

  • Color converter — Turn any color into HEX, RGB, HSL, OKLCH, and CMYK, and check the contrast ratio.

  • QR code generator — Make a static QR code for text, a URL, Wi-Fi, or a vCard. Set the colors and error correction, then download SVG or PNG.

  • Favicon generator — Make the ICO, the PNG sizes, the manifest, and the HTML snippet from a picture or letters.

Text

Counts, case, and the lines that changed between two texts.

Diff. Compare two texts and see the lines that changed.

  • Diff checker — Compare two texts side by side or inline, and download a unified patch.

Writing. Counts, case, and the limits a title or post has to fit.

  • Word counter — Words, graphemes, reading time, and the limits a title or post has to fit.

  • Case converter — camelCase, snake_case, and title case, including AP and Chicago rules.

Math & Finance

Loans, percentages, units, and the timestamps a schedule is counted in.

Time. Unix timestamps and the days between two dates.

Finance. Loan schedules and percentage math with decimal rounding.

  • Loan EMI calculator — A monthly installment and the full amortization table, rounded to the cent.

  • Percentage calculator — Percent of, percent change, reverse percent, and margin, with the formula shown.

Units. Convert length, mass, temperature, and data sizes.

  • Unit converter — Length, mass, temperature, and data sizes, with decimal and binary units kept apart.

Network

DNS, certificates, response headers, and the URLs a request is built from.

URLs. Encode and decode a URL and its query.

DNS. Look up public DNS records over HTTPS.

  • DNS lookup — Query A, AAAA, MX, TXT, CNAME, and CAA over DNS-over-HTTPS.

IP & subnets. Subnet math for IPv4 and IPv6.

  • CIDR calculator — Network, broadcast, host range, and membership for IPv4 and IPv6.

HTTP. Response headers, redirects, and a grade for the security headers.

  • HTTP headers — Follow redirects and grade the security headers on a public URL.

  • HAR analyzer — Drop a HAR capture, see where the time went.

  • cURL Converter — Turn any curl command into fetch, Python, Go, PHP, or Rust.

  • GraphQL Client — Query any GraphQL endpoint with variables, headers, and history.

  • WebSocket Tester — Connect to any ws/wss endpoint and inspect live frames.

TLS. Certificate expiry, the chain, and the names on a public host.

  • SSL checker — Expiry, names, and the chain for a certificate on port 443.

Use from your AI agent

The server is https://tools.fabwaseem.com/mcp. It speaks JSON-RPC over Streamable HTTP and answers with JSON (enableJsonResponse). There is no session id. POST is the only method. A human-readable setup page is at /mcp/guide.

Open Graph is two calls. list_og_templates returns the template ids, categories, defaults, and field schemas. build_open_graph takes a template id, the fields that template uses, colors, a size, and optional images, and returns a PNG plus the Next.js file. The input schema is in docs/MCP.md.

Cursor

~/.cursor/mcp.json

{
  "mcpServers": {
    "benchline": {
      "url": "https://tools.fabwaseem.com/mcp"
    }
  }
}

Claude Desktop

claude_desktop_config.json

{
  "mcpServers": {
    "benchline": {
      "url": "https://tools.fabwaseem.com/mcp"
    }
  }
}

A build that only starts a local command can use the same URL through mcp-remote:

{
  "mcpServers": {
    "benchline": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://tools.fabwaseem.com/mcp"]
    }
  }
}

VS Code

.vscode/mcp.json

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

curl

Send content-type: application/json and accept: application/json, text/event-stream. These two calls work against the live server without an initialize first.

tools/list:

curl -sS -X POST https://tools.fabwaseem.com/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

tools/call for format_json:

curl -sS -X POST https://tools.fabwaseem.com/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"format_json","arguments":{"json":"{\"a\":1}"}}}'

A successful call returns result.structuredContent and a text copy of the same JSON. A failure returns result.isError: true and a text message.

Rate limits

/mcp allows 60 requests a minute per address. POST /api/v1/tools/<slug> has its own bucket of 60 a minute. The address is the first x-forwarded-for hop, otherwise x-real-ip. A 429 body is a JSON-RPC error (Too many requests.) and the response sets retry-after.

A request that sends Origin must match the request host, localhost, 127.0.0.1, or https://tools.fabwaseem.com (the NEXT_PUBLIC_SITE_URL origin). No Origin header is fine, which is what curl does.

File inputs

File arguments accept either url or data, not both.

  • data is standard or URL-safe base64, or a data: URI. The decoded bytes are capped at 10 MB.

  • url must be public http or https on port 80 or 443, with no username or password. localhost, *.local, *.internal, and metadata.google.internal are refused. The host is resolved and refused when any address is loopback, private, link-local, CGNAT (100.64.0.0/10), multicast, or the IPv6 equivalents. Redirects are followed manually, up to four, and each hop is checked again. The fetch times out after 15 seconds. A declared or streamed body over 10 MB is refused.

The full input list is docs/MCP.md.

Privacy

60 tools run entirely in the browser. Text, files, and results stay on the device.

11 tools can fetch a public URL through this site. The page posts the URL or hostname you submit, the route fetches that address and does not write it anywhere, and private addresses are refused. Those routes allow 8 requests from one address every 10 minutes.

  • llms.txt generator — Read a public sitemap and write an llms.txt index, plus an optional llms-full.txt.

  • AI SEO checker — Score crawler access, llms.txt, structured data, and the on-page signals AI search uses.

  • robots.txt checker — Read allow and disallow rules, sitemap links, and the mistakes that make a robots.txt file lie.

  • Meta tags inspector — Read title, description, canonical, robots, Open Graph, Twitter, and JSON-LD types from one public URL.

  • Page to Markdown — Fetch a public page and turn the article into Markdown.

  • DNS lookup — Query A, AAAA, MX, TXT, CNAME, and CAA over DNS-over-HTTPS.

  • Sitemap validator — Check a sitemap URL or XML, or generate a urlset from a list.

  • HTTP headers — Follow redirects and grade the security headers on a public URL.

  • SSL checker — Expiry, names, and the chain for a certificate on port 443.

  • GraphQL Client — Query any GraphQL endpoint with variables, headers, and history.

  • WebSocket Tester — Connect to any ws/wss endpoint and inspect live frames.

An MCP call is different from the page. The server runs the function. A file sent as base64, or a public URL the server fetches, is read in memory for that call and is not written to disk. Tools whose MCP entry says they fetch the network are marked openWorld in the registry. Image and PDF pages still do the work in the browser; their MCP handlers accept a file because an agent has no local disk on this server.

Tech stack

Next.js 16 (App Router, React Server Components, output: "standalone"), React 19, TypeScript in strict mode, Tailwind CSS v4, shadcn/ui on Base UI (base-nova), zod 4, vitest, and the Model Context Protocol TypeScript SDK. pnpm 10.33.4. Node 22 in CI and in the Docker image. Fonts are Geist Sans and Geist Mono. Themes use next-themes (class on <html>).

Project structure

src/app/                  directory, category, tag, tool, explore, search, about, AI, MCP guide
src/app/mcp/route.ts      POST /mcp
src/app/api/v1/tools/     POST /api/v1/tools/<slug>
src/app/api/tools/        browser routes for the nine tools that fetch
src/tools/<slug>/         meta.ts, tool.tsx, lib/, mcp.ts
src/registry/             generated index, loaders, MCP registry, search index
src/lib/                  shared helpers, MCP handler, SSRF guard, rate limit
src/components/kit/       tool workspace blocks
src/components/ui/        themed primitives
src/components/shell/     directory
public/tools/<slug>/      cover.png and logo.png
scripts/gen-registry.ts
scripts/gen-readme-tools.ts
scripts/gen-mcp-docs.ts
scripts/live-mcp-smoke.mts

pnpm gen:registry scans src/tools/*/meta.ts and mcp.ts, checks them, and writes the registry. The directory imports metadata only. Tool UI is loaded with next/dynamic from the generated host, so opening the directory does not download every tool.

More detail is in docs/ARCHITECTURE.md.

Local development

Node 22 (see .nvmrc) and pnpm 10.33.4 (packageManager in package.json; Corepack will use it).

pnpm install
pnpm dev

pnpm dev starts Next on port 3000.

pnpm test
pnpm lint
pnpm typecheck
pnpm build
pnpm start

pnpm build runs pnpm gen:registry first. Tests are vitest, src/**/*.test.ts.

After a registry change:

pnpm gen:readme-tools
pnpm gen:mcp-docs

Docker

The image is a three-stage build in Dockerfile: install, pnpm build, then a Node 22 Alpine runner that starts node server.js on port 3000.

docker build -t benchline .
docker run --rm -p 3000:3000 benchline

The runner copies pdfjs-dist, zxing-wasm, tesseract.js, tesseract.js-core and its worker dependencies, satori, and @resvg/resvg-js next to the standalone server so the PDF, barcode, OCR, and Open Graph tools can load them.

Environment

Variable

Used by

Default

NEXT_PUBLIC_SITE_URL

Canonical URLs, Open Graph, and the MCP origin check

https://tools.fabwaseem.com

MCP_URL

scripts/live-mcp-smoke.mts only

https://tools.fabwaseem.com/mcp

Copy .env.example if you want a local origin. The app runs with neither variable set.

Live MCP smoke test

scripts/live-mcp-smoke.mts connects with the MCP client, calls tools/list, then tools/call for every listed tool. Samples live in that file. It waits 1.2 seconds between calls so a full sweep stays under the 60-a-minute limit, and it retries 429s. Results are written to /tmp/benchline-mcp-live-results.json. The process exits 1 when a call fails or a listed tool has no sample.

MCP_URL=https://tools.fabwaseem.com/mcp pnpm exec tsx scripts/live-mcp-smoke.mts

Adding a tool

Create src/tools/<slug>/ with meta.ts, tool.tsx, a pure lib/ and its vitest file, and mcp.ts. Add the slug to toolOrder, add the artwork, add a call sample to the endpoint test and to scripts/live-mcp-smoke.mts, then run pnpm gen:registry. The steps, the UI rules, and the MCP contract are in CONTRIBUTING.md.

Roadmap

New tools and changes are tracked as GitHub issues. A tool idea should use the tool request template: what it does, evidence that people need it, the MCP call, and whether it can run in the browser under the license policy. This repository does not keep a second, unpublished feature list.

License

MIT. Copyright (c) 2026 Waseem Anjum.

Acknowledgements

Benchline sits on Next.js, React, Tailwind CSS, shadcn/ui and Base UI, zod, Vitest, the Model Context Protocol TypeScript SDK, Lucide, and Geist (loaded through next/font). Tool implementations use the packages listed in package.json, including pdf-lib and sharp. New dependencies stay on permissive licenses. See CONTRIBUTING.md.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    B
    maintenance
    Swiss-army-knife utility MCP server for AI agents. 18 tools for JSON validation/formatting, base64 encode/decode, hash generation, UUID generation, URL parsing, regex testing, markdown↔HTML conversion, text stats, slug generation, datetime conversion, cron parsing, text diffing, CSV↔JSON conversion, and JWT decoding. Zero API Key required
    18
    5
    -
  • A
    license
    A
    quality
    C
    maintenance
    Remote MCP server with 21 tools: 10 Domain Dossier checks (DNS, MX, SPF, DMARC, DKIM, TLS, redirects, headers, CORS, web-surface) plus 10 developer utilities (base64, JWT decode, DNS lookup, UUID v4/v7, URL encode/decode, JSON format, User-Agent parse, IP lookup) and a dossier_full aggregate. Served over Streamable HTTP.
    21
    1
    -