Developers

Connect Clean.tools to your scripts or AI agents. Read-only tools, JSON in and JSON out: no key, no signup, requests processed in memory and never written to storage or logs. Deterministic where determinism is the point; cryptographically random where randomness is.

Connect in 30 seconds

Add to Cursor Add to VS Code

One click above, or point any MCP client at the Clean.tools server and every tool below shows up ready to call. Pick your client:

Claude Code
claude mcp add --scope user --transport http clean-tools https://mcp.clean.tools/mcp
Claude Desktop / Claude.ai (Settings, Connectors, Add custom connector)
https://mcp.clean.tools/mcp
Cursor (mcpServers)
{"mcpServers":{"clean-tools":{"url":"https://mcp.clean.tools/mcp"}}}
npm (stdio)
npx @clean-tools/mcp

Any other MCP-compatible client: point it at https://mcp.clean.tools/mcp (streamable HTTP, authless, no key).

VS Code, Windsurf, Cline, Zed, Continue, Gemini CLI, JetBrains, Warp, Goose, LibreChat, n8n, Zapier and the OpenAI Agents SDK all connect too. Choose your client above for its exact config, or see @clean-tools/mcp on npm for any stdio client.

Slim mounts — save your agent's context

Tool definitions cost context. If you only want a few tools, mount a subset with ?tools= and the server lists only those (calls to everything else still work):

Example: just the date/time tools
https://mcp.clean.tools/mcp?tools=explain_cron,validate_cron,convert_timezone,strftime_preview

REST quickstart

Every tool is also a plain HTTP endpoint at https://api.clean.tools/v1/<tool>. Here is a full request and response:

POST https://api.clean.tools/v1/convert_units
{ "category": "length", "value": 26.2, "from": "mile", "to": "km" }
200 OK
{ "category": "length", "value": 26.2, "from": "mile", "to": "km", "result": 42.1648128 }
curl
curl -s https://api.clean.tools/v1/convert_units \ -H 'content-type: application/json' \ -d '{"category":"length","value":26.2,"from":"mile","to":"km"}'
JavaScript (fetch)
const res = await fetch('https://api.clean.tools/v1/convert_units', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ category: 'length', value: 26.2, from: 'mile', to: 'km' }) }); const data = await res.json();

JSON in, JSON out. Bad input returns a 4xx with `{ "error": "...", "code": "..." }`. No auth, no keys. Request bodies are capped at 128 KB. Rate limit: about 60 requests/minute per caller with burst headroom — responses carry standard RateLimit-* headers, and a 429 includes Retry-After; honor it and add jitter. Requests are processed in memory and never written to storage or logs; the only thing counted is anonymous per-tool call totals (never arguments, results, or IPs).

The tools

The same engines behind these tool pages, callable by name.

ToolWhat it doesPage
explain_cronDescribe a cron expression and list its next run timesOpen
validate_cronValidate a cron expression and expand each fieldOpen
expand_rruleBuild an iCalendar RRULE and expand its occurrencesOpen
convert_timezoneConvert a time between two time zonesOpen
strftime_previewRender a strftime format string for a given timeOpen
amortization_scheduleCompute a mortgage payment and amortization scheduleOpen
tvm_solveSolve for any time-value-of-money variableOpen
compound_interestProject compound growth with optional contributionsOpen
apr_calcConvert rates and solve a loan's APROpen
interest_rateFind the interest rate between two valuesOpen
hash_textHash text with SHA-1, SHA-256, or SHA-512Open
diff_textLine diff two blocks of textOpen
test_regexRun a regular expression and return the matchesOpen
convert_dataConvert between JSON, CSV, TSV, and XMLOpen
luhn_validateValidate a number with the Luhn checksumOpen
convert_unitsConvert between units of measurementOpen
uuid_v4Generate version 4 UUIDsOpen
random_numberGenerate cryptographically random numbersOpen
generate_passwordGenerate a strong random passwordOpen
decode_jwtDecode a JWT's header and payload and check claimsOpen
encode_decodeEncode or decode URL and HTML textOpen
count_textCount words, characters, sentences, and paragraphsOpen
generate_qrGenerate a QR code as an SVGOpen
convert_caseConvert text between cases (camelCase, snake_case, and more)Open
fancy_textStyle text with Unicode glyphs (bold, italic, script)Open
render_markdownRender Markdown to sanitized HTMLOpen
lorem_ipsumGenerate lorem ipsum placeholder textOpen
redact_textRedact terms in text with block charactersOpen
format_sqlFormat and indent SQL queriesOpen
color_paletteBuild color palettes from a base colorOpen
color_contrastCheck WCAG contrast between two colorsOpen
css_gradientBuild a CSS gradient from color stopsOpen
percentagePercentage of, is what percent, and percent changeOpen
tipSplit a bill and calculate the tipOpen
convert_timestampConvert epoch and ISO timestamps across time zones
format_jsonFormat, minify, and validate JSON with data-loss warningsOpen
convert_yamlConvert between YAML and JSONOpen
convert_colorConvert a color between hex, RGB, HSL, HSV, CMYK, and OKLCHOpen
slugifyTurn text into URL and filename-safe slugs
convert_number_baseConvert numbers between bases 2-36 exactly
query_jsonExtract values from JSON with JSONPath
generate_idGenerate UUID v5/v7, ULID, and Nano ID identifiersOpen

Schemas and discovery

Privacy

The API runs the same engines as the tool pages: every tool is read-only and side-effect-free, most are deterministic (same input, same output), and the generator tools use cryptographic randomness. Requests are processed in memory and never written to storage or logs, and nothing is used to train anything. The only thing counted is anonymous per-tool call totals — never arguments, results, or IPs. There are no accounts and no keys. Full details on the privacy page.


More from Clean.tools