FIRST CH TOOLS / FOR AI AGENTS
Using These Tools from AI Agents
This site is designed to be used not only by people on screen, but also as tools for AI agents (Claude, ChatGPT, custom agents, and others). A machine-readable overview is available in llms.txt.
1 — URL Parameters
The calculation tools can be called directly via URL parameters. Any agent that can drive a browser just opens the page and reads the result from the DOM.
# Contrast ratio (fg=text color / bg=background, 6- or 3-digit hex, # optional) /en/contrast/?fg=333333&bg=ffffff # Character count (text=target text, URL-encoded) /en/moji/?text=hello%20world # OGP meta tag wizard (accepts title / description / url / image / site / card / type as initial values; starts on the generate step) /en/ogp/?title=Page%20Title&url=https://example.com/&image=https://example.com/og.png&type=website # Test data (rows / format=csv,tsv,json,xlsx / fields / locale / encoding / newline / bom / header / seed) /en/testdata/?rows=50&format=csv&fields=name,email,tel,zip,address&seed=test-2026 # Test data as an Excel file (.xlsx) /en/testdata/?rows=100&format=xlsx&fields=id,name,email,tel,zip,address # Boundary-length text (preset=character type / len=length; returns N-1 / N / N+1) /en/testdata/?preset=mixed&len=100 # Dummy file of an exact byte size (size / unit=B,KB,KiB,MB,MiB / ext=txt,csv,json,bin) /en/testdata/?size=10&unit=MiB&ext=csv # Cron expression explained, plus its next run times (e = expression, URL-encoded; tz = IANA time zone) /en/cron/?e=*%2F15%20*%20*%20*%20*&tz=Asia%2FTokyo # Base64 encode (text = string to encode, URL-encoded; urlsafe / wrap / datauri) /en/base64/?text=hello%20world # Base64 / data URI decode (b64 = Base64 body or a full data URI) /en/base64/?b64=SGVsbG8%3D # Break a URL apart (u=URL to parse, URL-encoded / tab=params,utm,encode) /en/url/?u=https%3A%2F%2Fexample.com%2F%3Futm_source%3Dgoogle%26q%3Da%2Bb # URL-encode / decode a string (text=the string / mode=encode,decode) /en/url/?text=hello%20world&mode=encode&tab=encode # Escape HTML special characters (text=string, URL-encoded / quotes=0 / apos=1 / numeric=1 / nonascii=none,named,decimal,hex) /en/html-escape/?text=%3Cb%3Ea%20%26%20b%3C%2Fb%3E # Decode HTML entities (html=string containing entities) /en/html-escape/?html=%26lt%3Bp%26gt%3B5%20%26amp%3Blt%3B%2010 # YAML to JSON (yaml=the YAML, URL-encoded / jsonindent=0,2,4,tab / sort=1 / ascii=1) /en/json-yaml/?yaml=name%3A%20web%0Aports%3A%20%5B80%3A80%5D # JSON to YAML (json=the JSON, URL-encoded / indent=2,4 / quote=auto,single,double / null=null,tilde,empty / block=0 / docstart=1) /en/json-yaml/?json=%7B%22name%22%3A%22web%22%7D&indent=4 # Colour conversion and alpha (c=colour in any format / a=alpha as 0–1 or 0–100 / bg=background / tab=convert,alpha,palette) /en/color/?c=%23c8501f&a=50&bg=%23ffffff # Hash generation and verification (text=input, URL-encoded / fmt=hex,HEX,base64,base64url / nl=lf,crlf / bom=1 / expect=checksum to verify) /en/hash/?text=hello&expect=5d41402abc4b2a76b9719d911017c592 # JWT decode and expiry check (token=the JWT / key=key to verify with / keyfmt=utf8,base64url,hex / skew=0,30,60,300 / tab=decode,claims,verify) /en/jwt/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.x # User-Agent parsing and device detection (ua=the UA string, URL-encoded / ua=me loads the browser's own UA) /en/user-agent/?ua=Mozilla%2F5.0+(Windows+NT+10.0%3B+Win64%3B+x64)+AppleWebKit%2F537.36 # UUID v4 / ULID bulk generation (type=uuid,ulid / count=1-100 / format=plain,json,csv,quoted / case=upper,lower / hyphens=0 / braces=1) /en/uuid/?type=ulid&count=20&format=json # Aspect ratio calculation (ratio=the ratio / w=width / h=height / round=none,round,even,floor,ceil / box=box size / fit=cover,contain / tab=calc,ratio,table,css) /en/aspect-ratio/?ratio=16:9&w=1280 # TSV/CSV to a Markdown table (tsv= / csv= / md= / text=input / to=markdown,csv,tsv,ssv,html,json / header=first,auto,none / align=auto,left,center,right / pad=0 / ea=0) /en/markdown-table/?tsv=a%09b%0A1%092 # Format a SQL query (sql=input / case=upper,lower,preserve / indent=2,4,8,tab / comma=trailing,leading / logic=leading,trailing / cols=0 / on=0 / expand=1 / compact=1) /en/sql-format/?sql=select%20*%20from%20t%20where%20id%3D1 # QR code generation (text=content / ec=L,M,Q,H / size=64-2048 / margin=0,1,2,4,8) /en/qr/?text=https%3A%2F%2Fexample.com%2F&ec=H # Unix timestamp ⇄ date (t=value, comma-separated for several / tz=IANA zone name / unit=auto,s,ms,us,ns) /en/unixtime/?t=1755999999&tz=Asia%2FTokyo # robots.txt generation (site=the site / policy=allow,custom,block / disallow, allow=comma-separated paths / ai=allow,block,training,none / sitemap=comma-separated absolute URLs / delay=seconds / style=allow-slash / comments=0) /en/robots-txt/?site=https%3A%2F%2Fexample.com&ai=training&sitemap=https%3A%2F%2Fexample.com%2Fsitemap.xml # Case conversion (text=input / format=camel,pascal,snake,constant,kebab,train,dot,title,sentence,lower,upper / scope=lines,items,whole / digits=1 / acronyms=1) /en/case/?text=user_name%0AfirstName&format=snake
2 — MCP Server
The contrast, character/X-weight, WebP-conversion, JSON-LD and llms.txt generation, encoding/line-ending conversion, Marp slide rendering, test-data generation, text-diff, cron-explanation, Base64/data-URI, URL-parameter, HTML-escaping, JSON⇄YAML-conversion, px⇄rem/em unit-conversion, colour-conversion, hashing, JWT-decoding, User-Agent-parsing, UUID v4 / ULID generation, aspect-ratio, Markdown-table / CSV-TSV conversion, SQL-formatting, QR-code generation, robots.txt generation and case conversion logic is also available as an MCP (Model Context Protocol — the standard for safely adding external capabilities to AI tools) server, @first-ch/tools-mcp. It is also registered in the official MCP registry as io.github.First-CH/tools-mcp.
Via npm (recommended) — one line to register with Claude Code.
claude mcp add firstch-tools -- npx -y @first-ch/tools-mcp
Claude Code plugin — install it from the marketplace instead.
/plugin marketplace add First-CH/firstch-tools-mcp /plugin install firstch-tools@first-ch
Any other MCP client — add this to its server config (e.g. mcp.json).
{"mcpServers":{"firstch-tools":{"command":"npx","args":["-y","@first-ch/tools-mcp"]}}}
Provided tools
contrast_check … returns the WCAG contrast ratio with AA/AAA verdicts count_chars … returns character counts, line count, and X weight (URL=23) webp_convert … converts PNG/JPEG files to WebP (same libwebp as the web tool, default quality 80) jsonld_generate … generates Organization/FAQ/Service/Breadcrumb JSON-LD (empty fields omitted) llmstxt_generate … generates an llmstxt.org-compliant llms.txt text encoding_convert … detects/converts encoding (Shift_JIS/UTF-8), BOM and line endings; outputs UTF-8 marp_render … renders Marp Markdown into slides and writes HTML/PDF testdata_generate… generates dummy CSV/JSON/Excel and exact-length boundary strings (seedable) diff_check … returns the diff of two texts (unified diff, line/word-level changes, counts) cron_explain … returns a plain-language reading of a cron expression plus its next run times (time-zone aware) base64_encode … encodes text/files as Base64 and data URIs with HTML/CSS snippets (and decodes them back) url_params … breaks a URL's query apart, edits and rebuilds it, adds UTM tags, strips click IDs, reports issues html_escape … escape HTML special characters / decode entities, with checks such as double escaping json_to_yaml … convert JSON to formatted YAML (error line/column plus warnings where meaning may change) yaml_to_json … convert YAML to JSON (expands multiple documents, anchors and merge keys; also a syntax checker) px_rem_convert … convert px⇄rem/em/pt, return the 12–64px scale, or swap the units across a whole stylesheet color_convert … convert between HEX/RGB/HSL/OKLCH, composite alpha, return contrast ratios and a tone palette hash_generate … MD5 / SHA-1 / SHA-256 / SHA-384 / SHA-512 of text or a file, verified against a published checksum jwt_decode … decode a JWT, judge its expiry, and verify the signature (HS/RS/PS/ES/EdDSA) when given the key user_agent_parse … identify browser, engine, OS, device type and bots from a UA string, and report what the UA cannot tell you uuid_generate … mint 1-100 UUID v4 or ULID values (ULIDs stay monotonic within a millisecond, so they sort in creation order) aspect_ratio_calc … convert between a ratio and a width/height, simplify a size, return per-breakpoint heights, CSS snippets and contain/cover fitting markdown_table … format TSV/CSV into a Markdown table (delimiter detection, full-width-aware padding, numeric columns right-aligned); also converts back to CSV/TSV/HTML/JSON sql_format … format one-line SQL with uppercase keywords, a line break per clause and indentation (identifiers and strings untouched); flags UPDATE/DELETE without WHERE and can collapse back to one line qr_generate … turn a URL or text into a QR code and return it as SVG (or PNG / text art), with error correction L/M/Q/H, size and quiet zone options unixtime_convert … convert Unix seconds/milliseconds/microseconds/nanoseconds to and from ISO 8601 and date strings (time zone, relative reading, many lines at once) robotstxt_generate … build a robots.txt from crawl rules, sitemap declarations and presets for 24 AI crawlers (one setting blocks training only) case_convert … convert identifiers between 11 cases (camelCase / snake_case / kebab-case / PascalCase / CONSTANT_CASE and more), in bulk or per CSV field, splitting acronyms and digit runs
Nothing is logged by default. Only when you set the FIRSTCH_TOOLS_USAGE_LOG environment variable to a file path does each tool call append one JSONL line to that local file — there is no network transmission of any kind.
3 — Policy
AI crawlers and agents are welcome (robots.txt allows everything). Processing generally runs entirely on the visitor's side, so we never receive any input data (the one exception is the TikTok Publisher: authorization and post-setting API calls are relayed through our stateless backend, while the video itself is sent directly from your browser to TikTok). Citing "First CH Tools (first-ch.com)" as a source is appreciated.