ToolForte
111 tools for AI assistants, free to start.
What it can do
- Text Diff: Compute an exact line-based diff between two texts with add/remove/unchanged stats.
- Format Json: Validate and pretty-print JSON with a real parser. Returns formatted JSON or the exact parse error.
- Markdown To Html: Convert Markdown to HTML deterministically.
What data it sees
Do you need an account
No: the server works without sign-in
111 tools for AI assistants, free to start. Exact answers instead of guesses: IBAN and VAT checks, VAT amounts, Dutch public holidays and working days, cron parsing, regex testing, JSON, CSV and Base64 transforms, UUIDs, Dutch test data. Render tools turn HTML or any URL into a hosted PDF or screenshot, make QR codes, merge and split PDFs, resize, convert and compress images, and read JavaScript-rendered pages as Markdown. Memory tools give the agent a private key-value store between sessions. Workflow tools run the multi-step workflows saved on your account by id.
Remote streamable HTTP endpoint: https://toolforte.com/api/mcp/mcp. For stdio-only clients: npx -y toolforte-mcp (npm). Setup guides per client (Claude, Claude Code, Cursor, VS Code, ChatGPT, Windsurf, Gemini CLI): https://toolforte.com/mcp
Utilities and memory are free. A free API key adds a monthly credit balance for renders and workflows; pass it as Authorization: Bearer tf_....
Server tool list (60)
Raw names from tools/list. Only developers need these.
| text_diff | Compute an exact line-based diff between two texts with add/remove/unchanged stats. |
| format_json | Validate and pretty-print JSON with a real parser. Returns formatted JSON or the exact parse error. |
| markdown_to_html | Convert Markdown to HTML deterministically. |
| csv_to_json | Parse CSV data into JSON with delimiter auto-detection and quoted-field handling. |
| url_encode | URL-encode or decode a string with exact percent-encoding. |
| base64 | Encode text to Base64 or decode Base64 to text, byte-exact. |
| test_regex | Run a JavaScript regular expression against a test string using a real regex engine. Returns all matches with capture groups and indices. |
| convert_color | Convert a CSS color between HEX, RGB, HSL, and HSB with exact math. |
| password_strength | Analyze password strength with entropy-based scoring and concrete feedback. Do not log or store the password. |
| count_words | Exact word, character, sentence, and paragraph counts plus reading time for a text. |
| parse_cron | Parse a cron expression into a human-readable description and the next scheduled run times. Exact cron semantics: use this instead of interpreting cron syntax yourself. |
| generate_uuids | Generate cryptographically random UUID v4 values. |
| validate_iban | Check whether an IBAN is well formed: the mod-97 checksum, the country code, the length that country's IBAN must have, and whether every position holds the kind of character that country allows there (mod-97 turns letters into numbers, so on its own it cannot see a capital O typed in place of a zero). Returns validity, country, and where known the bank identifier printed inside the IBAN. This is a format check, not a bank check: a passing IBAN can still name a bank code that never existed or has since merged away, and says nothing about whether the account exists or can receive a payment. For twelve countries it also verifies the national check digit that the bank computes over the bank code and account number (BE, FR, MC, ES, IT, SM, PT, SI, PL, TN, EE, HU); nationalCheck 'failed' there means the number is very probably invented, since that digit cannot be back-computed the way the mod-97 pair can. Absent nationalCheck means not checked, never approved. For Dutch IBANs it also names the institution behind the four-letter bank code, including codes that no longer issue accounts; an unrecognised code does not make the IBAN invalid. A territory that borrows another country's IBAN (Reunion, Guernsey, Aland and the like) is reported with the prefix it actually uses, since no IBAN starts with RE or GG. Never guess whether an IBAN is well formed: use this tool. Do not present a pass as confirmation that money can be sent. |
| generate_slug | Convert text into a URL-safe slug, handling unicode and diacritics deterministically. |
| validate_email | Validate email address syntax and detect common domain typos (e.g. gmial.com). |
| calculate_vat | Add VAT to a net amount or extract VAT from a gross amount at any rate (e.g. 21 for Dutch BTW). Returns exact net, VAT, and gross amounts rounded to cents. |
| check_vat_number_format | Check the format of an EU/GB/CH VAT number (syntax only, no VIES registration lookup). Supported country prefixes: AT, BE, BG, CY, CZ, DE, DK, EE, EL, ES, FI, FR, HR, HU, IE, IT, LT, LU, LV, MT, NL, PL, PT, RO, SE, SI, SK, GB, CH. |
| dutch_public_holidays | Exact Dutch public holidays for a year, including movable feasts (Easter, Ascension, Whitsun) and King's Day rules. Use this instead of computing Dutch holidays yourself. |
| working_days_between | Count working days (Mon-Fri) between two dates inclusive, optionally excluding Dutch public holidays. Exact date math for SLA, payroll, and planning questions. |
| generate_test_bsn | Generate Dutch BSN test numbers that pass the elfproef (11-check) but belong to no real person. For development and test data only. |
| generate_test_iban | Generate structurally valid test IBANs for NL, DE, BE, FR, or GB that belong to no real bank account. Each one carries the country's own character layout, correct mod-97 check digits, and for Belgium and France the national check digit the bank computes over the account, so it also passes validate_iban in full. For development and test data only. |
| generate_brp_test_data | Generate Dutch BRP/GBA test persons with valid BSNs, families, addresses and life events (married, widowed, deceased, moved, living abroad). Use this instead of inventing Dutch personal data: made-up BSNs fail the elfproef and are rejected by real systems. Deterministic per seed. For more than 50 people or CSV output, use the REST API at https://toolforte.com/api/v1/tools/brp-test-data-generator |
| generate_upa_files | Generate UPA pension declaration XML (the Dutch payroll-to-pension-fund message) for one or more periods, with employments, schemes and optional deliberate defects that a receiving system should reject. Deterministic per seed. XML is large, so ask for the summary format unless you need the file contents; for bulk use the REST API at https://toolforte.com/api/v1/tools/upa-file-generator |
| convert_case | Convert a text to one case style: upper, lower, title, sentence, camel, pascal, snake or kebab. Returns the converted string. Arguments: text, mode. Same result as POST /api/v1/tools/text-case-converter. |
| generate_lorem_ipsum | Generate classic lorem ipsum placeholder text as paragraphs, sentences, words or a list, optionally wrapped in HTML. Deterministic: the same options give the same text. Arguments: count?, type?, startWithLorem?, html?, seed?. Same result as POST /api/v1/tools/lorem-ipsum-generator. |
| sort_lines | Sort the lines of a text A to Z, Z to A, by length, in natural numeric order, or shuffle them with a seed. Can drop duplicates and ignore case. Returns the sorted text and line count. Arguments: text, mode?, caseInsensitive?, removeDuplicates?, reverse?, seed?. Same result as POST /api/v1/tools/sort-lines. |
| dedupe_lines | Remove repeated lines from a text while keeping the original order. Returns the cleaned text with how many lines were removed. Arguments: text, caseInsensitive?, trim?, keepFirst?. Same result as POST /api/v1/tools/remove-duplicate-lines. |
| reverse_text | Reverse a text by characters, by word order per line, or by the characters of each line. Returns the reversed string. Arguments: text, mode?. Same result as POST /api/v1/tools/reverse-text. |
| find_and_replace | Replace every occurrence of a string or regular expression in a text. Supports case sensitivity, whole word matching and regex groups in the replacement. Returns the new text and the number of replacements. Arguments: text, find, replace?, caseSensitive?, wholeWord?, useRegex?. Same result as POST /api/v1/tools/find-and-replace. |
| word_frequency | Count how often each word occurs in a text and return a ranked table, most frequent first, with counts and percentages. Can ignore case, skip short words and drop common stop words. Arguments: text, ignoreCase?, minLength?, excludeStopWords?, limit?. Same result as POST /api/v1/tools/word-frequency-counter. |
| reading_time | Estimate how long a text takes to read and to speak aloud, from the text itself or a word count, at a chosen words-per-minute plus slow, average and fast presets. Arguments: text?, wordCount?, readingWpm?, speakingWpm?. Same result as POST /api/v1/tools/reading-time-calculator. |
| rot13 | Apply ROT13, or any Caesar shift from 1 to 25, to a text. Letters rotate and keep their case; digits and punctuation stay as they are. Decoding with shift 13 gives the original back. Arguments: text, shift?, decode?. Same result as POST /api/v1/tools/rot13. |
| morse_code | Translate text to International Morse code or Morse back to text. Letters are separated by a space and words by a slash; characters without a Morse code are dropped. Arguments: text, mode?. Same result as POST /api/v1/tools/morse-code-translator. |
| numbers_to_words | Write a number out in English words, up to 999 quadrillion, with decimals read digit by digit or as a currency amount in dollars, euros or pounds. Optional British style with "and". Arguments: number, mode?, currency?, british?. Same result as POST /api/v1/tools/numbers-to-words. |
| roman_numerals | Convert a whole number from 1 to 3999 into a Roman numeral, or a Roman numeral back into a number, with strict validation and a symbol-by-symbol breakdown. Detects the direction from the input unless a mode is given. Arguments: value, mode?. Same result as POST /api/v1/tools/roman-numeral-converter. |
| clean_text | Clean up messy text: collapse extra spaces, trim lines, drop empty lines, strip HTML tags, remove punctuation, digits, emojis or control characters, and straighten smart quotes. Returns the cleaned text and how many characters each step removed. Arguments: text, extraSpaces?, trimLines?, emptyLines?, lineBreaks?, htmlTags?, punctuation?, numbers?, emojis?, plainQuotes?, controlChars?. Same result as POST /api/v1/tools/text-cleaner. |
| json_to_csv | Turn a JSON array of objects, or a JSON string holding one, into CSV text. Nested objects become dotted column names such as address.city, arrays are written as JSON inside the cell, and every key seen in any row becomes a column. Arguments: json, delimiter?, includeHeader?, flatten?. Same result as POST /api/v1/tools/json-to-csv. |
| json_to_yaml | Convert a JSON string to YAML text. Strings are quoted only when a YAML reader would otherwise see a number, boolean, date or empty value, multi-line strings become block scalars, and keys can be sorted. Arguments: json, indent?, sortKeys?, nullStyle?. Same result as POST /api/v1/tools/json-to-yaml. |
| yaml_to_json | Parse YAML text and return both the value and its JSON text. Reads maps, lists, inline [lists] and {maps}, quoted and block scalars and comments. Anchors, aliases, merge keys, tags and multi-document files are not supported and are reported with the line number. Arguments: yaml, indent?. Same result as POST /api/v1/tools/yaml-to-json. |
| xml_to_json | Parse XML into a JSON object keyed by the root element. Attributes become keys with a prefix ("@id"), text beside attributes or children lands under "#text", repeated elements become arrays, and namespace prefixes can be dropped. Malformed XML is reported with the line number; DTD-declared entities are not expanded. Arguments: xml, attributePrefix?, dropNamespaces?, indent?. Same result as POST /api/v1/tools/xml-to-json. |
| json_to_xml | Serialise a JSON string as XML. Object keys become element names, array items repeat the parent key, null and empty objects become self-closing tags, and the root element name is yours to choose. A top-level array is wrapped in the root with one item element per entry. Arguments: json, rootName?, declaration?. Same result as POST /api/v1/tools/json-to-xml. |
| format_xml | Pretty-print XML with consistent indentation, or minify it by removing the whitespace between tags. Elements that hold only text stay on one line, and comments, CDATA and processing instructions are kept. Malformed XML is reported with the line number rather than reshaped. Arguments: xml, mode?, indent?. Same result as POST /api/v1/tools/xml-formatter. |
| csv_to_markdown | Turn CSV text into a GitHub-style Markdown table. Detects the delimiter (comma, semicolon, tab or pipe) unless told, reads quoted fields with embedded delimiters and newlines, and can align columns and pad cells so the table lines up in plain text. Arguments: csv, delimiter?, firstRowHeader?, padded?, alignment?. Same result as POST /api/v1/tools/csv-to-markdown. |
| format_sql | Pretty-print a SQL statement: keywords in upper case, each major clause (SELECT, FROM, WHERE, JOIN, GROUP BY, ORDER BY and so on) on its own line, and indentation inside CASE and parentheses. String literals are left untouched. A formatter, not a parser: it does not check that the SQL is valid. Arguments: sql. Same result as POST /api/v1/tools/sql-formatter. |
| html_entities | Encode text as HTML entities or decode entities back to text. Encoding always covers &, <, >, quotes and common typographic characters, and can cover every non-ASCII character too, named where HTML has a name (é) and numeric otherwise. Decoding reads numeric references and HTML 4 named entities; unknown names are left as they are. Arguments: text, mode?, encodeNonAscii?. Same result as POST /api/v1/tools/html-entity-encoder. |
| json_to_typescript | Derive TypeScript interfaces from a JSON sample. Nested objects become their own interfaces named after their key, arrays become typed arrays (a union when the items differ), null stays null, and properties can be made optional or readonly. Arguments: json, rootName?, exportInterfaces?, optionalProps?, readonlyProps?. Same result as POST /api/v1/tools/json-to-typescript. |
| hash_text | Hash a text with SHA-1, SHA-256, SHA-384 or SHA-512 and return the hex digest, or all four at once. Text is hashed as UTF-8. No MD5: it is broken and Web Crypto does not offer it. Arguments: text, algorithm?. Same result as POST /api/v1/tools/hash-generator. |
| decode_jwt | Decode a JSON Web Token into its header and payload, and explain the exp, iat and nbf claims as ISO dates with an expired flag. The signature is returned but never verified. Arguments: token, now?. Same result as POST /api/v1/tools/jwt-decoder. |
| convert_timestamp | Convert a Unix timestamp (seconds or milliseconds) to an ISO 8601 UTC date, or an ISO date to a Unix timestamp. Returns both timestamps, the ISO and RFC 7231 forms, and the weekday. Arguments: value, unit?. Same result as POST /api/v1/tools/timestamp-converter. |
| convert_number_base | Convert a whole number from one base to another, any base 2 to 36, and also return its binary, octal, decimal and hexadecimal forms. Exact for numbers of any size, no rounding. Arguments: value, fromBase?, toBase?. Same result as POST /api/v1/tools/number-base-converter. |
| generate_password | Generate one or more random passwords of a chosen length from lower case, upper case, digits and symbols, optionally without look-alike characters. Returns the passwords with their entropy in bits and a rough crack time. Arguments: length?, uppercase?, lowercase?, numbers?, symbols?, excludeAmbiguous?, count?. Same result as POST /api/v1/tools/password-generator. |
| random_numbers | Draw random whole numbers between a minimum and maximum, inclusive, using cryptographic randomness. Ask for several at once, with or without repeats, for dice, lottery draws or samples. Arguments: min?, max?, count?, allowDuplicates?. Same result as POST /api/v1/tools/random-number-generator. |
| chmod | Convert Unix file permissions between octal (755) and symbolic (rwxr-xr-x) form. Returns both, a read/write/execute breakdown for owner, group and others, and the chmod command to apply them. Arguments: permissions. Same result as POST /api/v1/tools/chmod-calculator. |
| http_status | Look up what an HTTP status code means. Give a code (404), a class (4xx) or a word (timeout) and get the name, class, one-line meaning, typical use case and RFC reference for every match. Arguments: query. Same result as POST /api/v1/tools/http-status-codes. |
| px_to_rem | Convert a pixel value to rem or a rem value to pixels for a given root font size, 16px unless told otherwise. Returns both numbers and CSS-ready strings. Arguments: value, direction?, rootFontSize?. Same result as POST /api/v1/tools/px-rem-converter. |
| build_utm_url | Add utm_source, utm_medium, utm_campaign, utm_term and utm_content to a URL, keeping any query parameters it already has. Returns the tagged link plus warnings about upper case or missing required tags. Arguments: url, source?, medium?, campaign?, term?, content?. Same result as POST /api/v1/tools/utm-builder. |
| color_contrast | Compute the WCAG 2 contrast ratio between a text colour and a background colour and say whether it passes AA and AAA for normal and large text. Accepts hex, rgb() or hsl(), and suggests a nearby colour when it fails. Arguments: foreground, background. Same result as POST /api/v1/tools/color-contrast-checker. |
| percentage | Answer one percentage question from two numbers: what x% of y is, what percent x is of y, the percentage change from x to y, or x increased or decreased by y%. Returns the number and a sentence stating it. Arguments: mode, x, y. Same result as POST /api/v1/tools/percentage-calculator. |
| compound_interest | Grow a starting amount at an annual rate for a number of years, compounding monthly, quarterly or annually, with an optional monthly contribution. Returns the future value, total contributed, total interest and a year-by-year table. Arguments: principal, annualRatePercent, years, compoundsPerYear?, monthlyContribution?. Same result as POST /api/v1/tools/compound-interest-calculator. |
| loan_payment | Work out an annuity loan from the amount, annual interest rate and term: the fixed monthly payment, total paid, total interest and an amortisation schedule of up to 360 months showing principal, interest and remaining balance. Arguments: amount, annualRatePercent, term, termUnit?. Same result as POST /api/v1/tools/loan-calculator. |