Tools Mcp

io.github.First-CH由 GitHub 账号 First-CH 发布v0.51.0更新于 Nov 8, 2026

Web production tools for AI agents: contrast, JP text, WebP, JSON-LD, slugs, dates and 40+ more

概览

AI 生成的概览

本地 MCP 服务器,为助手提供 40 多种网页制作工具(对比度、编码、差异、哈希、JSON-LD、Marp 幻灯片)及可选的站点检查工具。

可以做什么
  • 检查与转换颜色、单位、字符编码、换行符、Base64/data URI、JSON/YAML、CSV/TSV 与命名风格
  • 统计日文字符数与 X 发帖权重,生成 URL slug,换算和历与工作日日期
  • 生成 JSON-LD、llms.txt、测试假数据与 UUID/ULID 批量值;计算哈希、解码 JWT、解析 User-Agent、解释 cron 表达式
  • 比较文本或文件差异,并将 Marp Markdown 渲染为自包含 HTML 或 PDF
  • 启用后可对网址做站点检查:GEO/AI 搜索就绪度、meta 标签、安全响应头、SSL、重定向、失效链接、标题结构、结构化数据
适用场景
适合助手在处理网页内容或前端代码时,需要在本机完成可靠、确定性的转换与检查。可选的 app 工具适合快速审计公开网址的 SEO、安全响应头与链接状况。
运行要求
需要 Node.js 24 或更高版本,通过 npx 从 npm 包启动。可选环境变量:FIRSTCH_APPS_BASE_URL(app 工具的基础地址,仅用于测试)、FIRSTCH_TOOLS_USAGE_LOG(本地 JSONL 使用日志)、MARP_CHROME_PATH(用于 PDF 输出的 Chrome/Chromium 路径)。app_* 工具默认关闭,需设置 FIRSTCH_ENABLE_APPS=1 才启用。
安装前请注意
启用 app_* 工具后,传入的网址、域名或文本会发送到 apps.first-ch.com,该服务还会访问目标站点并看到你的公网 IP;AI 文本检查会把文本转交 Cloudflare Workers AI。不要向这些工具传入机密内容。写文件的工具除非设置 overwrite,否则不会覆盖已有文件。仅当设置 FIRSTCH_TOOLS_USAGE_LOG 时才会写入本地日志文件。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Tools Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

@first-ch/tools-mcp

MCP server exposing First CH Tools' free web-tool logic — WCAG contrast, JP character/X-weight counting, WebP conversion, JSON-LD generation, llms.txt generation, encoding/line-ending conversion, Marp Markdown→slide rendering, Japanese/English test-data generation, text/code diffing, cron-expression explanation, Base64/data-URI encoding, URL query-parameter editing, HTML entity escaping/unescaping, JSON⇄YAML conversion, px ⇄ rem/em unit conversion, colour-code conversion with alpha compositing, MD5/SHA-1/SHA-256/SHA-384/SHA-512 hashing, JWT decoding with expiry and signature checks, User-Agent parsing with device/bot detection, bulk UUID v4 / ULID generation, aspect-ratio calculation with responsive sizing, case conversion between camelCase, snake_case and kebab-case, CSV/TSV ⇄ JSON conversion, IP/CIDR calculation with subnet splitting and IP-range reduction, business-day date calculation with Japanese public holidays, HTML-to-Markdown conversion, Japanese era ⇄ Western date conversion with age calculation, and URL-slug generation from Japanese titles — to AI agents such as Claude Code. All of those run on your machine.

It also ships app_* tools for the 39 web apps at apps.first-ch.com (site checks such as GEO/AI-search readiness, meta tags, security headers, SSL certificates, DNS and email DNS, redirects, broken links, structured data, AI-crawler access, Japanese readability, and AI-assisted business-tone and LP-copy checks). Unlike the local tools, an app_* tool sends its input (a URL, domain name or text) to apps.first-ch.com and returns the JSON the app's API responds with — see Network access, files and privacy.

日本語版は 後半セクション を参照してください。

Install

Three ways to add this server, pick whichever fits your client.

Requires Node.js >=24 (all three methods below run the server via npx, so Node must be installed even when the MCP client itself — e.g. Claude Code's native, no-Node install — doesn't strictly require it).

1. npm, via the Claude Code CLI

bash
claude mcp add firstch-tools -- npx -y @first-ch/tools-mcp

2. Claude Code plugin (also installs the same MCP server)

/plugin marketplace add First-CH/firstch-tools-mcp/plugin install firstch-tools@first-ch

3. Any other MCP client (generic JSON config)

Add to your client's server config (e.g. mcp.json / claude_desktop_config.json):

json
{  "mcpServers": {    "firstch-tools": {      "command": "npx",      "args": ["-y", "@first-ch/tools-mcp"]    }  }}

This server is also registered in the MCP Registry as io.github.First-CH/tools-mcp (see server.json), so registry-aware clients can discover and install it by that name too.

Tools

ToolWhat it doesMain input
contrast_checkComputes the WCAG 2.1 contrast ratio between a foreground and background color and returns AA/AAA pass/fail (normal text, large text, UI components)fg, bg (hex, e.g. #333333 / 333 / fff)
count_charsCounts Japanese text by grapheme, breaks it down into zenkaku/hankaku, counts lines, and computes the X (Twitter) post weight (zenkaku=2, hankaku=1, URL=23 flat, limit 280)text
webp_convertConverts PNG/JPEG files (absolute paths) to WebP using the same libwebp WASM encoder (default quality 80) as the browser tool at tools.first-ch.com/webp/. Output defaults to the same directory as each input with a .webp extensionpaths[] (absolute paths), quality? (1-100), outputDir?
jsonld_generateGenerates schema.org JSON-LD for organization / faqpage / service / breadcrumb. Empty fields are omitted automatically. Returns both a json object and a ready-to-embed <script> snippettype, plus the matching organization / faq / service / breadcrumb object
llmstxt_generateGenerates an llms.txt file (per the llmstxt.org proposed format) summarizing a site for AI crawlers/agentssiteName, summary?, notes?, sections?
encoding_convertDetects the character encoding (UTF-8 / Shift_JIS), BOM and line endings (CRLF / LF / CR) of a file or text and converts it to UTF-8. Useful for diagnosing garbled Japanese CSVs and for normalising line endings. Output is UTF-8 only — encoding to Shift_JIS is not supported (no standard API, and a mapping table would be required).base64 or text, mode (analyze | convert), encoding, newline, bom
marp_renderRenders Marp Markdown to slides. Emits a self-contained HTML file (theme CSS inlined; opens in a browser and prints one-slide-per-page) and optionally PDF. Ships a bundled Japanese theme firstch (paper/ink/vermilion; uses IBM Plex Sans JP if installed) used as the default theme. Marp front-matter in the Markdown (theme: / paginate: / size: / <!-- _class: lead -->) is honored.markdown or inputPath, theme?, formats? (html | pdf), outputPath?, title?
testdata_generateGenerates dummy data for form / CSV-import testing. mode=records returns names, kana readings, addresses, postal codes, emails and phone numbers as CSV/TSV/JSON/XLSX with a choice of encoding (UTF-8 / Shift_JIS), BOM and line endings. format=xlsx returns a real Excel workbook as base64 (or writes it to outputPath) — the ZIP/OOXML parts are assembled directly, with no spreadsheet dependency, and postal codes and phone numbers are written as text cells so leading zeros survive; mode=text returns strings of exactly n-1 / n / n+1 characters for maxlength boundary tests. All output is fictional (emails use the RFC 2606 example.com family). Passing a seed makes the output reproduciblemode?, rows?, fields?, format?, locale?, encoding?, newline?, bom?, header?, seed?, preset?, length?, outputPath?
diff_checkCompares two texts (or two files) and returns the added/removed/changed line counts plus a unified diff (.patch) — the same logic as the browser tool at tools.first-ch.com/diff/. Lines are matched with patience diff (lines occurring exactly once in both sides become anchors), falling back to Myers only inside anchor-less ranges. With format=blocks / both, paired changed lines are also compared at token level (runs of letters/digits are one token, CJK characters one each) and returned as changed_parts, so you can see which words changed. CRLF/CR/LF all count as the same line break; trailing-whitespace-only differences are ignored by defaulta/b (text) or pathA/pathB (absolute paths), format? (unified | blocks | both), context?, ignoreWhitespace?, ignoreCase?, words?
cron_explainExplains a cron expression in plain language and returns the upcoming run times — the same logic as the browser tool at tools.first-ch.com/cron/. Parsing follows Vixie cron (crontab(5)): ranges, steps, lists, JAN-DEC / SUN-SAT names and the @daily-style shorthands; six fields means the first one is seconds (node-cron / Spring style). warnings call out the traps — day-of-month and day-of-week are OR'd (not AND'd) when both are restricted, */n that does not divide its range evenly is not a uniform interval, and impossible dates such as February 30th never fire. Run times are found on the wall clock of the target time zone and converted back to real instants, so they stay correct across daylight-saving transitionsexpression, timeZone? (IANA, default UTC), count? (default 5, max 100), from? (ISO 8601)
base64_encodeEncodes text or a file as Base64 and a data: URI, and returns ready-to-paste HTML <img> / CSS background-image snippets — the same logic as the browser tool at tools.first-ch.com/base64/. With mode="decode" it turns Base64 or a data URI back into bytes, writing them to outputPath when given. For SVG it returns both encodings and defaults to the shorter one (percent-encoding beats Base64, which always inflates by ~33%), always escaping & " < > # %, whitespace and non-ASCII so the URI drops straight into an HTML attribute or a CSS url("…"). Decoding accepts standard or URL-safe Base64, tolerates whitespace and newlines, does not require padding, and trusts the actual magic numbers (PNG/JPEG/GIF/WebP/ico/PDF/zip/woff/woff2/SVG) over the MIME type a data URI claimsmode? (encode default / decode), text? or path?, base64?, outputPath?, urlSafe?, wrap? (76 for MIME), dataUri?, mimeType?, snippets?
url_paramsBreaks a URL's query string into keys and values, edits it (set / remove / utm / removeTracking / sort) and rebuilds it — the same logic as the browser tool at tools.first-ch.com/url/. Values come back decoded (%XX to characters, + to a space), and parameters you did not touch are written back byte-for-byte, so calling it with nothing but a url returns exactly what you passed in — signed URLs survive a round trip. reencode normalises the whole query with encodeURIComponent rules instead. warnings flag duplicate keys, unencoded spaces and non-ASCII, broken %XX, + being read as a space, mixed-case UTM values, a missing utm_source/utm_medium, passwords in the URL, credential-looking keys and URLs over 2,000 characters. Relative paths and broken percent-encoding are parsed as far as they can be read instead of throwing. mode="encode" / "decode" converts a bare string instead (scheme: component / uri / form). No network access — the URL is never fetchedurl?, mode? (parse default / encode / decode), text?, scheme?, set?, remove?, utm?, removeTracking?, sort?, reencode?, spaceAsPlus?
html_escapeEscapes < > & " ' into HTML entities, or with mode="unescape" turns entities such as &amp;, &#39; and &#x3042; back into characters — the same logic as the browser tool at tools.first-ch.com/html-escape/. Escaping handles & first, so a second pass never double-escapes what the first pass produced; pick named or numeric references (numeric), decide whether quotes are escaped (quotes, mandatory inside an attribute value) and whether ' is written as &#39; or &apos; (apos — &apos; does not exist in HTML 4.01), and encode non-ASCII characters as references (nonAscii) when the charset may not survive the pipeline. Unescaping covers all 252 named references from HTML 4.01 plus decimal and hexadecimal ones, maps C1-range references such as &#128; to their Windows-1252 characters as the spec requires, and leaves unknown names, out-of-range numbers and semicolon-less references untouched rather than guessing. notes reports already-escaped input, bare &, missing semicolons, unknown entity names and no-break spaces (U+00A0)mode? (escape default / unescape), text? or path?, outputPath?, quotes?, apos?, numeric?, nonAscii? (none / named / decimal / hex)
json_to_yamlConverts JSON to formatted YAML, and yaml_to_json converts back — the same logic as the browser tool at tools.first-ch.com/json-yaml/, with no YAML dependency (the parser and writer are implemented in this package). Choose the indent width, the quoting style (quote), how null is written (nullStyle), whether multi-line strings become ` blocks (block), whether keys are sorted (sortKeys) and whether the output starts with --- (docStart). Strings another parser could read as a different type — yes/no/on/off, 0755, 12:30, 2026-08-12, anything numeric-looking — plus strings with surrounding whitespace or a leading -/*/#are quoted automatically, so the output means the same thing to a YAML 1.1 parser such as PyYAML. JSON containing comments, trailing commas, single quotes or unquoted keys (as intsconfig.json) is read and converted, with notes saying it is not valid JSON (relaxed=false` rejects it strictly instead)
yaml_to_jsonConverts YAML to JSON — useful for turning docker-compose, GitHub Actions, Kubernetes and CI config into something a program can handle, and for checking that a file parses at all. A syntax error is returned as an error naming the line, the column, the cause and the fix, with the two surrounding lines quoted and a ^ under the column. Multiple documents (---) become a single JSON array, and anchors (&name), aliases (*name) and merge keys (<<) are expanded because JSON has no references (notes says when that happened). Scalars follow the YAML 1.2 core schema, so yes / no / on / off / NO stay strings — but notes flags them, along with 0755 (decimal 755, not octal), 12:30 (750 in YAML 1.1's base 60), date-like values, duplicate keys and integers beyond 2^53. Supports block mappings and sequences, flow style, quoted scalars (multi-line, with escapes), block scalars (` > with chomping and an explicit indent), tags (!!str !!int !!float !!bool !!null !!binary) and comments; only the explicit ? key` notation is unsupported
px_rem_convertConverts CSS lengths between px, rem, em and pt — the same logic as the browser tool at tools.first-ch.com/px-rem/. Pass value for a single conversion and you get px/rem/em/pt, a ready-to-paste font-size line and the scale of common font sizes (12–64px, one row per size with its typical use); pass css or path and the whole stylesheet is rewritten (direction: px2rem default / px2em / rem2px / em2px). The bulk pass never touches comments, strings (content: "10px"), the contents of url() or digits inside identifiers such as --size-16px, and by default keeps hairlines in px (minPx=2, because a 1px border in rem varies in thickness between devices) and leaves the conditions of @media and other at-rules alone (skipMedia), which is where breakpoints live. ignoreProps excludes properties by prefix, zeroUnitless writes a bare 0. The root can be given as a percentage (root="62.5%" → 10px, read against the 16px browser default), and notes reports rounding, skipped values and the accessibility cost of the 62.5% trickvalue? (24 / "1.5rem") or css? / path?, unit?, outputPath?, direction?, root?, parent?, precision? (auto or 0-6), minPx?, zeroUnitless?, skipMedia?, ignoreProps?, scale?
color_convertConverts a colour between HEX, RGB, HSL and OKLCH and builds the rgba() / hsla() / 8-digit HEX code at any alpha — the same logic as the browser tool at tools.first-ch.com/color/. Input can be HEX (3/4/6/8 digits), rgb(), hsl(), hwb(), oklch(), oklab(), one of the 148 CSS named colours or transparent, in either the legacy comma form or the modern slash form, with angles in deg / grad / rad / turn. Pass a background and flattened returns the colour that actually reaches the screen once the transparency is composited over it (foreground × α + background × (1−α)) — what you need to turn a semi-transparent layer from a mockup into a solid HEX. It also returns the WCAG 2.1 contrast against white and black, an alpha_table stepped by step%, and an 11-step lightness palette (50–950) that keeps the hue and chroma. An OKLCH value outside sRGB has its chroma lowered by binary search until it fits, keeping the lightness and hue, because clipping the RGB channels would shift the hue; notes says when that happened, when the colour matches a named colour exactly, and when it is a neutral greycolor, alpha? (0-1, 0-100 or "50%"), background? (default #ffffff), syntax? (modern default / legacy), uppercase?, alphaPercent?, step? (1-50, default 10), alphaTable?, palette?
hash_generateComputes the MD5, SHA-1, SHA-256, SHA-384 and SHA-512 digests of a string or a file in one call — the same logic as the browser tool at tools.first-ch.com/hash/. Pass expected and the digest is verified against it: the algorithm is inferred from the length, and verification says whether it matched. expected takes command output as-is — the <digest>␣␣<filename> form from sha256sum, the output of shasum -a 256, the SHA256 (file) = … form, a sha256: prefix, colon-separated hex, Base64 and base64url are all understood. Output is lower-case hex by default, or HEX / base64 / base64url. For text, newline (lf / crlf) and bom control the exact bytes that get hashed, so a digest produced from a Windows file can be reproduced (the encoding is always UTF-8); neither applies to path, which is hashed byte for byte and streamed in a single pass when large. notes warns that MD5 and SHA-1 are broken for collision resistance and that a plain digest is not password storagetext? or path?, algorithms? (default ["md5","sha1","sha256","sha512"]), format? (hex default / HEX / base64 / base64url), newline?, bom?, expected?
jwt_decodeDecodes a JWT (JSON Web Token) into its header and payload and reports on the expiry — the same logic as the browser tool at tools.first-ch.com/jwt/. token can be a whole Authorization: Bearer <token> line: the header name, the Bearer prefix, surrounding quotes, trailing commas and line breaks inside the token are all stripped. expiry gives the status (valid / expired / not_yet / no_exp), the ISO timestamps of exp / nbf / iat, the seconds remaining and how far through its lifetime the token is; clockTolerance allows for clock skew, and now pins the current time so a check is reproducible. Pass key and the signature is verified with Web Crypto: HS256/384/512 take the shared secret as a string (keyEncoding accepts base64url / hex), while RS / PS / ES / EdDSA take an SPKI PEM public key or a JWK / JWKS document (a JWKS is matched against the header's kid). A private key, a certificate or a PKCS#1 key is refused with the command that converts it. warnings cover alg: none, a missing signature, an expired or not-yet-valid token, exp given in milliseconds (Date.now() without dividing by 1000), a lifetime that is too long for an access token, and secrets or personal data left in the payload — which anyone holding the token can read, because base64url is encoding, not encryption. A five-segment JWE returns its header only (it is not decrypted), and nothing is ever fetched: JWKS documents must be passed intoken, key?, keyEncoding? (utf8 default / base64url / base64 / hex), clockTolerance? (seconds), now? (Unix seconds)
user_agent_parseParses a User-Agent string into browser name and version, rendering engine, OS and version, device type (desktop / mobile / tablet / tv / console / wearable / bot), vendor and model, and CPU architecture — the same logic as the browser tool at tools.first-ch.com/user-agent/. ua can be a raw access-log line: a leading User-Agent:, surrounding quotes and a trailing comma are stripped. Detection tries the more specific token first (Edg/ → OPR/ → Chrome/ → Safari/), because Chrome, Edge and Opera all claim both Chrome/ and Safari/ and a substring match misclassifies them. tokens breaks the string down token by token and explains the fossils (Mozilla/5.0, KHTML, like Gecko, Mobile/15E148). notes reports what the UA cannot tell you: Chrome's reduced UA (minor version frozen to 0.0.0, Android model frozen to K), macOS always reporting 10_15_7, Windows 10 being indistinguishable from 11, an iPad sending the same UA as a Mac, in-app browsers (LINE / Instagram / Facebook / Android WebView), and the fact that a UA is self-declared and must never be used for access control. Crawlers (Googlebot, bingbot, GPTBot, ClaudeBot, PerplexityBot) and HTTP clients (curl, python-requests, axios) are identified as well. Pass uas to parse many at once and get a summary breakdown by browser, OS and device typeua? or uas? (array), includeTokens? (default: on for 20 strings or fewer)
uuid_generateGenerates 1-100 UUID v4 or ULID values at once — the same logic as the browser tool at tools.first-ch.com/uuid/. A UUID v4 is 128 bits of which 122 are random (the other 6 carry the version and variant); a ULID is 26 characters where the first 10 encode the creation time (Unix milliseconds, 48 bits) and the last 16 are random (80 bits), written in Crockford's Base32. Because a ULID leads with the time, sorting the strings lexicographically sorts them chronologically, and timestamp (ISO 8601, Unix seconds or Unix milliseconds) pins that time for reproducible output. Values minted inside the same millisecond follow the monotonic rule from the ULID spec — the random part is incremented by one — so a batch of 100 still comes out in creation order. Randomness comes from node:crypto randomBytes (CSPRNG); Math.random is never used. format shapes text (one per line / JSON array / comma separated / quoted for a SQL INSERT), and uppercase / hyphens / braces control the spelling (UUID defaults to lower case per RFC 9562, ULID to upper case; hyphens: false gives the 32-character form for MySQL BINARY(16), braces: true the Windows GUID form)type? (uuid | ulid), count? (1-100), format?, uppercase?, hyphens?, braces?, timestamp? (ULID only)
aspect_ratio_calcCalculates between an aspect ratio and a size — the same logic as the browser tool at tools.first-ch.com/aspect-ratio/. Pass ratio (16:9, 16/9, 16x9 or a decimal such as 1.85) with either width or height and the other side comes back, along with the simplified ratio, the decimal, the padding-top percentage and an aspect-ratio declaration. Pass width and height without a ratio and it works backwards: the ratio simplified by the greatest common divisor, the orientation, the megapixel count, the closest common ratio (16:9, 4:3, 3:2, 1:1, 4:5, 9:16, 21:9, 1.85:1, 2.39:1, 1.91:1 for OGP, the golden ratio, A-series paper) with the percentage it is off by, and the name of the size where there is one (1920×1080 is FHD). round takes the result to the nearest whole pixel, an even number, down or up, and notes then reports the real ratio that rounding produced and how far it drifts — H.264 / H.265 store colour at half resolution (YUV 4:2:0), so round: "even" is what video needs. box fits the size into a frame with contain or cover and returns the rendered size, the scale, the letterbox / pillarbox bars, how many pixels are cropped and how much stays visible. widths (or table: true) returns the height at every breakpoint, and snippet: true returns the CSS — with an optional @supports padding-top fallback — plus HTML carrying the width / height attributes that prevent layout shiftratio? and/or width? / height?, round? (none default / round / floor / ceil / even), widths?, table?, box? ("1280x400"), fit? (cover default / contain), snippet?, selector?, target? (img / video / iframe / background), objectFit?, fallback?
markdown_tableTurns TSV or CSV copied from a spreadsheet into a Markdown table, and converts a Markdown table back to CSV, TSV, HTML or JSON — the same logic as the browser tool at tools.first-ch.com/markdown-table/. Copying a range in Excel, Google Sheets or Numbers puts tab-separated text on the clipboard, not comma-separated, so the delimiter is detected by parsing with tabs, commas and semicolons in turn and keeping whichever gives the most consistent column count — thousands separators (1,200) never split a column. CSV input follows RFC 4180 quoting (commas, newlines and doubled quotes inside a quoted field). When padding cells, full-width characters are counted as two columns following the Unicode East Asian Width property, so the pipes line up in a monospaced editor. Columns whose non-empty cells are all numeric (thousands separators, decimals, currency symbols, percent signs, units) are right-aligned with ---:, and aligns overrides any column. Pipes inside cells become |, line breaks become <br> (or a space), short rows are padded with empty cells, and every fix is reported in notes rather than applied silently. Reading a Markdown table picks up the alignment colons and turns <br> back into a real newline, so a CSV export reopens cleanly in a spreadsheettext or path, outputPath?, from? (auto default / tsv / csv / ssv / markdown), to? (markdown default / csv / tsv / ssv / html / json), header? (first default / auto / none), align?, aligns?, pad?, eastAsian?, autoNumber?, trim?, skipEmpty?, transpose?, multiline? (br default / space), eol?
sql_formatFormats a SQL query that has been squashed onto a single line — uppercase keywords, a line break per clause and real indentation — the same logic as the browser tool at tools.first-ch.com/sql-format/. SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY / LIMIT / INSERT INTO / VALUES / UPDATE / SET / DELETE FROM / WITH / UNION start a line and their contents are indented one level; joins start a line with ON indented below them; AND / OR break per condition, except the AND of BETWEEN a AND b. A parenthesis becomes an indented subquery only when SELECT, WITH or VALUES follows it, so function calls (SUM(…), IN (1, 2, 3), OVER (PARTITION BY … ORDER BY …)) stay on one line, and CASE gets WHEN / ELSE / END stacked. Only keywords and type names are re-cased — table, column and alias spellings are left exactly as typed, because identifier folding differs per database. Strings, quoted identifiers ("…" / `…` / […]), comments and placeholders (? / :name / $1 / @var) pass through verbatim. notes reports UPDATE or DELETE without a WHERE, unbalanced parentheses and quotes, SELECT *, implicit comma joins and placeholder usage. compact collapses everything back onto one line. It is a lexical formatter rather than a parser for one database, so MySQL, PostgreSQL, SQL Server, SQLite and Oracle dialects survive as written (syntax errors are not detected)text or path, outputPath?, keywordCase? (upper default / lower / preserve), functionCase?, indent? (2 / 4 default / 8 / tab), commaStyle? (trailing default / leading), logicStyle? (leading default / trailing), breakColumns?, breakLogic?, breakOn?, breakCase?, breakSubquery?, expandClauses?, compact?, eol?
qr_generateTurns a URL or any text into a QR code and returns it as SVG (vector), PNG or terminal-friendly text art — the same logic as the browser tool at tools.first-ch.com/qr/. Encoding (numeric, alphanumeric or UTF-8 byte mode, picked automatically from the input), Reed–Solomon error correction, the layout of finder, timing and alignment patterns, version information and the choice between the eight mask patterns are all implemented here (JIS X 0510 / ISO 18004, versions 1–40); there is no external API or image service. ecLevel trades capacity for damage tolerance (L about 7%, M about 15%, Q about 25%, H about 30% — use Q or H for print), size is the edge length in pixels, and margin is the quiet zone in modules (4 is the recommended default; 0 can break scanning over a patterned background). Wi-Fi (WIFI:T:WPA;S:…;P:…;;), mailto:, tel:, SMSTO: and geo: strings just go in as text. outputPath writes the file instead of returning the body; format="png" without it returns a data URI. Capacity tops out at 7,089 digits, 4,296 alphanumeric characters or 2,953 bytes (all at level L)text, ecLevel? (L / M default / Q / H), size? (64–4096, default 320), margin? (0–32, default 4), format? (svg default / png / text), mode? (auto default / numeric / alnum / byte), mask? (0–7), minVersion?, outputPath?
unixtime_convertConverts Unix seconds, milliseconds, microseconds and nanoseconds to and from ISO 8601 and ordinary date strings — the same logic as the browser tool at tools.first-ch.com/unixtime/. The unit of a plain number is detected from its digit count (up to 10 digits seconds, up to 13 milliseconds, up to 16 microseconds, longer nanoseconds); unit states it outright instead. Digits below the millisecond are dropped and reported in notes. On the date side it accepts 2026-08-24T09:30:00Z (ISO 8601), 2026-08-24 18:30, 2026/8/24 9:05, the Japanese 2026年8月24日 18時30分, Sun, 24 Aug 2026 03:00:00 GMT (HTTP-date) and now, stripping the quotes, brackets and trailing commas that come with a paste from CSV or JSON. input takes one value per line, up to 500 lines at a time, and every row comes back with Unix seconds, milliseconds, ISO 8601 in UTC, local time in timeZone (with weekday and UTC offset) and a relative reading ("30分後" / "in 30 minutes"); a line that cannot be read fails on its own without taking the others down. A date with no offset is read as a wall-clock time in timeZone and always says so in notes; an explicit +09:00 or Z in the input wins over timeZone. A wall-clock time that daylight saving skips is moved forward to the moment after the change, also noted. An 8-digit number such as 20260824 is Unix seconds here, so it is flagged in case a date was meant. Negative values (before 1970) and fractional seconds workinput, timeZone? (IANA name, default UTC), unit? (auto default / s / ms / us / ns), now? (Unix milliseconds or a date string, default the current time), lang? (ja default / en)
robotstxt_generateAssembles a robots.txt from crawl rules, sitemap declarations and a preset for AI crawlers — the same logic as the browser tool at tools.first-ch.com/robots-txt/. ai.preset decides how 24 known AI crawlers are treated in one move: training (the default: refuse the ones that collect training data — GPTBot, ClaudeBot, Google-Extended, Bytespider, CCBot and the rest — while allowing AI search and on-demand fetchers such as OAI-SearchBot, Claude-SearchBot, PerplexityBot and ChatGPT-User), allow, block, none (leave AI crawlers out) or custom with ai.overrides naming them one by one. A crawler obeys exactly one matching group, so writing a group for GPTBot stops the User-agent: * rules from ever reaching it; by default the shared disallow paths are copied into the AI groups to close that gap (ai.inherit: false turns it off). Paths get a leading slash added and full URLs reduced to their path, and warnings reports spaces inside a path, non-ASCII paths that need percent-encoding, wildcards that not every crawler supports, a Crawl-delay Googlebot will ignore, a missing sitemap, a User-agent listed twice and a site blocked in full. listCrawlers: true returns just the crawler list (name, vendor, purpose) without generating anythingsiteUrl?, disallow?, allow?, userAgents? (default *), crawlDelay?, blockCrawlers?, sitemaps?, ai? (preset?, overrides?, inherit?), groups?, comments? (default true), allowStyle? (disallow-empty default / allow-slash), listCrawlers?, lang? (ja default / en), outputPath?
case_convertConverts identifiers between eleven cases — camelCase, PascalCase, snake_case, CONSTANT_CASE, kebab-case, Train-Case, dot.case, Title Case, Sentence case, lower case and UPPER CASE — the same logic as the browser tool at tools.first-ch.com/case/. Built for the mechanical jobs at the boundary between layers: renaming variables in bulk, moving between snake_case database columns and camelCase JSON keys, tidying CSV headers. scope sets the unit of work: lines (the default, one item per line), items (every comma or tab separated field of a line, for CSV header rows) or whole. Leading and trailing spaces, indentation, line endings (LF/CRLF) and the separators are preserved, so only the names change. A run of capitals is broken only before a capital followed by a lower-case letter (XMLHttpRequest → XML / Http / Request), and digits stay attached to the word before them (sha256Hash → sha256 / Hash; splitDigits splits them). Acronyms fold to parseXmlData by default and stay capitalised with keepAcronyms, except the first word of a camelCase name, which is always lower-cased (URLParser → urlParser). Characters with no letter case (Japanese, for example) pass through rather than being transliterated. notes reports names that collide after conversion (first name and first_name both become first_name, which is how a column silently disappears on import), results starting with a digit that cannot be identifiers, and items containing acronyms; items[].detected names the case each input was written in. allFormats expands every item into all eleven cases, listFormats returns just the list of cases with what each is used fortext? or path?, outputPath?, format? (camel default), scope? (lines default / items / whole), splitDigits?, keepAcronyms?, allFormats?, listFormats?, lang? (ja default / en)
csv_convertConverts CSV/TSV into a JSON array and back — the same logic as the browser tool at tools.first-ch.com/csv-json/. For moving data you already have between a spreadsheet and an API: turning an exported table into JSON a request body can carry, or an API response into something Excel opens. With direction omitted it guesses json2csv when the input starts with [ or { and csv2json otherwise. The delimiter is detected by looking at the first 20 lines for the character that appears the same number of times on every line, and can be pinned with delimiter. Column names such as stock.qty are read and written as nested objects, and tags.0 / tags.1 (tags[0] means the same) become an array — the reverse direction flattens by the same rule, so a round trip through CSV restores the original structure (nest: false writes nested values into a single cell as JSON text). Type inference is decided by round trip — a value becomes a number only when converting it back to text is character-for-character identical — so 0123, +1, 1.50 and integers beyond 2^53 (12345678901234567890) stay strings and postcodes, phone numbers, invoice numbers and version strings survive. Reading follows RFC 4180: quoted cells, "" escapes, line breaks inside cells, CRLF and a BOM are all handled, and the output side offers bom and newline for Excel. On the JSON side it accepts an array, a single object, an object wrapping an array such as {"data":[…]}, and JSON Lines. A JSON syntax error comes back as an ok: false result with a line, a column and an excerpt rather than an exception, so the reply itself says where to fix it. notes also reports rows whose column count does not match the header, duplicate header names (kept as name_2), empty headers (named column4), values that would lose digits, cells starting with =, +, - or @ that a spreadsheet may execute as a formula (CSV injection), and objects with a different set of keystext? or path?, outputPath?, direction? (auto default / csv2json / json2csv), delimiter? (auto default / comma / tab / semicolon / pipe), header?, nest?, types?, trim?, emptyNull?, indent? (2 default / 0–8 / tab), newline? (lf default / crlf), quoteAll?, bom?, lang? (ja default / en)
zenkaku_convertConverts letters and digits, katakana, symbols and spaces between their full-width and half-width forms with a direction chosen per kind, and cleans up the whitespace in the same pass — the same logic as the browser tool at tools.first-ch.com/zenkaku/. For normalising Japanese copy supplied by a client, cleaning a file before an import, and tidying form input. Each of alnum / kana / symbol / space takes keep, han (half-width) or zen (full-width); the defaults are the form most Japanese copy is set in — letters, digits, symbols and spaces half-width, katakana full-width (the same as preset: 'ja'). preset offers ja, csv (ja plus the whitespace and invisible-character cleanup), han and zen, and any per-kind option overrides it. Half-width katakana is not one character per glyph, so converting to full-width composes a following voiced mark (ガ → ガ, パ → パ, ヴ → ヴ) and converting the other way splits it into two. Japanese punctuation, brackets, the middle dot and the prolonged sound mark (。 、 「 」 ・ ー) live inside the half-width katakana block (U+FF61–U+FF9F) and are treated as katakana (kana: 'han' turns 「テスト」。 into 「テスト」。; use keep to leave the punctuation full-width). Spaces cover U+3000 ⇄ U+0020 and fold NBSP and the Latin space family to the half-width side. The cleanup is collapseSpaces (a run of spaces becomes its first character), trimLines, blankLines (keep / collapse / remove), removeInvisible (zero-width, BOM, control codes) and composeMarks (NFC, for copy that writes ガ as カ plus a combining U+3099). Line endings (LF/CRLF), tabs, hiragana and kanji are never rewritten. notes reports what is left — half-width katakana, ideographic spaces, invisible characters, combining marks — plus the wave dash 〜 (U+301C) versus the fullwidth tilde ~ (U+FF5E) and platform-dependent characters (① ㈱ Ⅲ), which are reported and never rewritten because which way they should go depends on the destination. This is deliberately not NFKC: ① never becomes 1, and only the kinds you selected are touched. inspect: true converts nothing and returns just the audittext? or path?, outputPath?, preset? (ja / csv / han / zen), alnum?, kana?, symbol?, space? (each keep / han / zen), collapseSpaces?, trimLines?, blankLines? (keep default / collapse / remove), removeInvisible?, composeMarks?, inspect?, lang? (ja default / en)
cidr_calcTurns CIDR notation, a subnet mask, an ACL wildcard mask or a bare address into the network address, broadcast address, usable host range, address and host counts, reverse DNS zone and a binary breakdown — the same logic as the browser tool at tools.first-ch.com/cidr/. For subnet maths while writing server configs, firewall rules and Basic-auth allow lists. IPv4 and IPv6 both work: :: compression, a trailing IPv4 form (::ffff:192.168.0.1), [...] brackets and a %zone suffix are parsed, and output follows RFC 5952. 192.168.1.5 255.255.255.0 and 192.168.1.5/0.0.0.255 (the ACL convention) are accepted in the same field. The exceptions in host counting are built in: a /31 has two usable addresses for point-to-point links (RFC 3021), a /32 is one host, and IPv6 has no broadcast address. When host bits are set in the address you pass, notes returns the block it actually belongs to — the form that belongs in a config file. Octets with a leading zero (192.168.001.1) are refused, because some libraries read them as octal and the same text then means a different address. The address type is matched against the main IANA special-purpose blocks (private, CGNAT, loopback, link-local, documentation, multicast, ULA and more) and a network that extends beyond its reserved range is flagged. split lists the equal subnets of a new prefix length, contains tests addresses for membership, and range reduces ranges such as 10.0.0.5 - 10.0.0.200 (mixed with CIDR blocks and single addresses, one per line or ;-separated) to the fewest blocks that cover them exactly, merging overlaps and adjacencies first. All arithmetic is BigIntcidr? and/or range?, split? (prefix length), contains? (string[]), limit? (1-4096, default 256), lang? (ja default / en)
date_calcCounts the days and business days between two dates, works out the due date N days or N business days from a start date, and turns a closing day plus payment terms into a payment date — the same logic as the browser tool at tools.first-ch.com/date-calc/. For delivery dates, acceptance deadlines and payment schedules. A business day is any day that is not a weekend, a Japanese public holiday or a closure you list; the holiday table shipped with the package is the one published by Japan's Cabinet Office (1970–2027), so the "Happy Monday" holidays that move each year, substitute holidays after a Sunday holiday, citizens' holidays squeezed between two holidays (2026-09-22) and the shifting equinox days are all counted. mode="between" returns calendar days, business days, the breakdown of days off and every holiday in the range. mode="add" moves n (negative counts backwards) units from base and also lists the days it skipped; "within 10 business days of receipt" differs by one depending on whether day zero counts, so counting starts the day after by default (the Japanese civil-code rule) and include_start=true makes the start date day 1. mode="payment" resolves invoice + closing + pay_months + pay_day, moving a payment that lands on a day off by pay_adjust (default prev, the usual Japanese practice). The weekend, the New Year break, your own closures and your working weekends can all be set. Dates are held as days since 1970-01-01, so the server's time zone cannot shift the answermode? (between / add / payment), start?, end?, base?, n?, unit? (business default / days / weeks / months / years), include_start?, adjust?, invoice?, closing? (eom default / 1-31 / none), pay_months?, pay_day?, pay_adjust?, weekend?, holidays?, year_end?, closed_dates?, work_dates?, lang?
html_to_markdownConverts an HTML fragment into Markdown — the same logic as the browser tool at tools.first-ch.com/html-md/. For turning a fetched page into something an LLM can read cheaply, and for moving existing web copy into Markdown. Headings (h1-h6), paragraphs, line breaks, emphasis, strikethrough, lists (nested, the start attribute, checkboxes), tables (thead / caption, with column alignment taken from align and text-align), links, images, code blocks (the language comes from class="language-*"), block quotes, horizontal rules, definition lists, figure / figcaption and details / summary are all handled, while script, style, anything marked hidden or display:none and presentational div / span wrappers are removed. The HTML is not parsed with the browser DOM: the tokeniser and tree builder are written by hand, so this server and the web page agree exactly, and unclosed elements are closed at the end while stray closing tags are dropped — the counts always come back in notes. An attribute quote that is never closed stops the tag there, because carrying on would swallow the rest of the document as one attribute value. Whatever Markdown cannot express is reported rather than dropped in silence: merged cells (a colspan is padded with empty cells, a rowspan keeps its value on the first row only), a cell holding a list or a code block (that table is left as HTML), definition lists (written in the Markdown Extra : form) and sup / sub / mark / iframe / svg (unknown chooses between keeping them as HTML, reducing them to text and removing them). Tables, task lists and strikethrough are GFM extensions, so gfm=false switches them off. base_url rewrites relative links and images as absolute URLs — the thing that breaks most often in a migration — and main_only keeps only main / article, dropping header, nav, footer, aside and form. It never touches the network; fetching the page is the caller's jobhtml? or path?, outputPath?, main_only?, base_url?, gfm?, escape?, pad_tables?, headings? (atx default / setext), bullet? (- / * / +), code_block? (fenced / indented), links? (inline / reference / strip), images? (keep / alt / drop), tables? (gfm / html), unknown? (keep / text / drop), br? (spaces / backslash / html / space), lang? (ja default / en)
wareki_convertConverts Japanese era dates (Reiwa, Heisei, Showa, Taisho, Meiji) and Western dates both ways and returns the weekday and zodiac — the same logic as the browser tool at tools.first-ch.com/wareki/. For converting and checking the dates in contracts, invoices and official forms. mode="convert" takes date or dates (up to 1000) and detects which calendar each one is in: 2026-10-01, 2026/10/1, 20261001, 2026年10月1日, 令和8年10月1日, R8.10.1, 令和八年十月一日, ㋿8.10.1, Reiwa 8 and so on. A year alone (1989, 昭和64年) or a year and month (2019-05) also works, and both eras are returned when the period spans an era change. formats gives the era date (gannen, with weekday, in kanji numerals), the short forms (R8.10.1 / R08.10.01), Western, ISO 8601 and English. Eras begin on 1912-07-30 (Taisho), 1926-12-25 (Showa), 1989-01-08 (Heisei) and 2019-05-01 (Reiwa). Era dates that never existed (Heisei 32, Heisei 31 May 1, Reiwa 1 April 30) are still converted, and notes gives the correct era date; a written weekday that does not match comes back as WEEKDAY_MISMATCH. Before 1873 (Meiji 5 and earlier) only the year is converted, because dates were lunisolar (LUNAR_CALENDAR). mode="age" takes birth (era dates accepted) and reference (today in Japan time if omitted) and returns the exact age (it goes up on the birthday; people born on February 29 turn older on March 1 in common years), years/months/days, the kazoe age, the next birthday and the entry and graduation years from elementary school to university. mode="eras" returns the era list, plus a year chart of era, zodiac and age when from_year / to_year are given (up to 500 years). Badly written dates come back as ok: false with error.codemode? (convert / age / eras), date?, dates?, birth?, reference?, from_year?, to_year?, lang? (ja default / en)
slug_generateBuilds a URL slug for WordPress and other CMSs from a Japanese title — the same logic as the browser tool at tools.first-ch.com/slug/. Kana are written in Hepburn romaji (し→shi, ち→chi, つ→tsu, ふ→fu, じ→ji, しゃ→sha, a small っ doubles the consonant as in kitte / matcha, ん is always n, ファ→fa, ティ→ti, ヴァ→va), symbols are removed and the words are joined with hyphens (or underscores with separator="snake") and lowercased, so the result is only a-z, 0-9 and the separator. Kanji readings are not guessed: pass the reading in kana as reading and the slug is built from it instead of title (spaces in reading become separators: とうきょう で たべた ラーメン 10せん → tokyo-de-tabeta-ramen-10-sen). Kanji left without a reading are skipped and reported in skipped and a KANJI note. Words also split at symbols, kanji, kana ⇄ Latin/digit changes and (with splitKatakana, the default) hiragana ⇄ katakana changes. longVowel="omit" (default) collapses ou/oo/uu and ー (tokyo, ramen; ei and ii stay), "keep" spells them out (toukyou, raamen). The particles は・へ・を come out as spelled (ha, he, o). maxLength cuts at a word boundary. Digits-only slugs (which can clash with date archives so WordPress may append -2) and slugs over 60 characters are flagged. variants gives all four separator × long-vowel spellings, and items builds up to 1000 slugs at once with a DUPLICATE note for collisionstitle?, reading?, items? (strings or {title, reading}), separator? (kebab default / snake), longVowel? (omit default / keep), maxLength? (0–200, 0 = no limit), splitKatakana?, lang? (ja default / en)
htpasswd_generateBuilds htpasswd lines for HTTP Basic authentication — the same logic as the browser tool at tools.first-ch.com/htpasswd/ — for putting a staging site or a pre-delivery preview behind a password. Hashes are bcrypt ($2y$, as Apache's htpasswd -B, cost 5 by default) or apr1-md5 ($apr1$, for Apache 2.2 and other servers that cannot read bcrypt). Pass one user and password, or many as users ("user:pass" strings or {user, password}) or bulk (one user:password per line, # lines and blank lines skipped), up to 200. A user with an empty password gets a random 16-character password, returned in generated (CSPRNG, without look-alike characters such as 0 O o 1 l I); passwords you pass in are not echoed back. User names that contain :, are empty or exceed 255 bytes are skipped, and duplicates, passwords under 12 characters, equal to the user name, with leading/trailing spaces, non-ASCII or over bcrypt's 72-byte limit are flagged in notes. With server (apache / nginx) it also returns the .htaccess or nginx snippet, with file, realm and ips (IPv4 / IPv6 / CIDR let through without a password; paths with spaces are quoted, unreadable addresses are left out and flagged). mode="verify" (or just hash) checks a password against an existing htpasswd line or hash ($2y$ / $2b$ / $2a$, $apr1$, $1$, {SHA}; bcrypt above cost 14 is not computed). outputPath writes the file instead of returning it. Passwords are never loggeduser + password, or users[] / bulk; algo? (bcrypt default / apr1), cost? (4–14, default 5), server? (apache / nginx), file?, realm?, ips?, mode? (generate / verify), hash?, outputPath?, lang? (ja default / en)
openapi_doc_generateTurns an OpenAPI 3.x / Swagger 2.0 specification (YAML or JSON) into a Markdown API reference in Japanese (or English with lang: "en") and TypeScript type definitions — the same logic as the browser tool at tools.first-ch.com/openapi-doc-gen/. The Markdown lists base URLs, an endpoint index, and per-tag tables of parameters, request bodies and responses plus the schemas, generating example responses from the schema when none are written (examples: false turns this off). The TypeScript output turns components.schemas (Swagger: definitions) into interfaces/types and, with operations (default true), adds Params / RequestBody / Response types per endpoint. Handles $ref, allOf / oneOf / anyOf, enum, nullable and additionalProperties; names that clash with TypeScript keywords or each other are renamed and reported in notes. $refs to other files or URLs are never fetched (typed unknown, flagged OA_EXTERNAL_REF) — pass a bundled single-file spec. Uses the same hand-written YAML/JSON parser as json_to_yaml, except that a folded line starting with - is read as part of the description. Syntax errors come back as ok: false with the code, line, column and an excerpt. outputDir writes <title>.md and <title>.ts instead of returning them. Up to 20 MBspec or path (absolute), lang? (ja | en), examples?, operations?, output? (both | markdown | typescript), outputDir?
faq_jsonld_generateBuilds schema.org FAQPage JSON-LD, the same Q&A as Markdown, and paste-ready <details>/<summary> HTML from question/answer pairs (same logic as tools.first-ch.com/faq-jsonld/). Unlike jsonld_generate (type=faqpage), answers are read as light Markdown — blank lines make paragraphs, - / 1. make lists, [text](URL) and bare URLs become links — and a pasted "Q: … / A: …" or "## heading" block is split into pairs. Flags duplicate questions, unsafe (javascript:) and relative links; escapes </script so the JSON-LD block cannot be broken out ofitems[] ({q, a}) and/or bulk, title?, level? (2/3), answer_format? (html / text), wrap_script?, exclusive?, lang?
lines_processTidies one-item-per-line text — the same logic as the browser tool at tools.first-ch.com/lines/ — for de-duplicating and sorting lists of keywords, URLs, e-mail addresses or product names, or turning them into a bullet list. The steps always run in this order, once each: trim (leading/trailing half- and full-width spaces, tabs, NBSP) → removeBlank (empty and whitespace-only lines) → dedupe (dedupeMode: first keeps the first copy / unique drops every line that repeats / dupes keeps only lines that repeat, once each; ignoreCase folds case) → sort (asc / desc / reverse / shuffle; asc and desc read numbers as numbers with numeric, default true — item2 < item10, -3 < 1.25 < 10, numeric lines before text — using the Japanese Intl.Collator) → prefix / suffix → number (start, sep: dot / paren / colon / bracket / tab / space, pad for zero padding; outside the prefix). preset (uniqsort = trim + drop blanks + dedupe + ascending, clean, numbered, mdlist = - bullets, shuffle) starts from the same settings as the web version's buttons; individual options override it. shuffle with a seed (0–4294967295) reproduces the same order; without one it uses cryptographic randomness. The line ending of the first line break is kept for every line, and so is a trailing newline. Returns which lines repeat and how often (duplicates), and notes on groups that differ only in surrounding spaces, case or full/half width. Pass text or path; outputPath writes the result to a filetext or path, outputPath?, preset?, trim?, removeBlank?, dedupe?, dedupeMode?, ignoreCase?, sort?, numeric?, seed?, prefix?, suffix?, number?, start?, sep?, pad?, lang? (ja default / en)
dpi_calcPrint size ⇄ pixels for print-ready artwork (same logic as tools.first-ch.com/dpi/). size: pixels needed for a paper (A0-A6, JIS B1-B6, Japanese business card, postcard, photo L, US Letter… 28 presets, or custom mm) at a dpi (default 350) with bleed (default 3 mm), rounded up, plus uncompressed RGB/CMYK size, an artwork spec memo and notes (too low / no bleed / safe area / PSD 30,000 px limit). reverse: print size and effective dpi of an image on a paper (picks the better orientation) with a verdict and the pixels needed for 350 dpi. table: quick-reference table as text / Markdown / CSV. units: mm / cm / inch / px / pt / Q conversionmode?, paper? / widthMm+heightMm, dpi?, bleedMm?, width+height (px), format?, value+from?, lang?
serp_checkChecks whether a page's <title>, meta description and URL fit in a Google search result by pixel width, not character count (same judgement logic as tools.first-ch.com/serp/, without the visual preview). Desktop = 600px column, title 20px × 1 line, description 14px × 2 lines; mobile = 380px, 2 / 3 lines. Wraps CJK per character and Latin per word with simple kinsoku, returns the visible lines, the cut-off part, width vs. limit, grapheme counts, a state (ok / cut / short / empty), checks (empty, truncated, too short, no site-name separator, not https, deep path, percent-encoding), the breadcrumb and paste-ready tags. Widths are an approximation (Arial advance widths + 1em for CJK, no kerning), so they can run a few px wider than a browser measurementtitle?, description?, url? or items[] (up to 500), device? (desktop / mobile / both), lang?
css_layout_generateBuilds copy-ready CSS and HTML for a Flexbox or CSS Grid layout (same logic as tools.first-ch.com/css-layout/). Only non-default declarations are written, repeated tracks fold into repeat(). Validates grid-template-areas (equal cell counts per row, rectangular names, valid names, track-count mismatch) and emits grid-area rules. Notes flag combinations that do nothing (flex-grow vs justify-content, align-content with nowrap, 1fr tracks leaving no free space) and common pitfalls (min-width: auto overflow, 1fr minimum, reverse/dense reading order). Eight presets (holy grail, auto-fit grid, sidebar, header…)mode? (flex / grid / presets), preset?, flex: direction?, wrap?, justifyContent?, alignItems?…; grid: columns?, rows?, areas?, autoFit?, flow?…; gap?, count?, items?, lang?
wiki_doc_lintAudits an exported internal wiki — Markdown, HTML or text exported from Notion, Backlog Wiki, Confluence and the like (same logic as tools.first-ch.com/wiki-doc-lint/). Returns near-duplicate page pairs (duplicates: Jaccard index of four-character fragments of the text with symbols and spaces removed, at or above threshold, with the lines only one side has and a fix that keeps the page with more incoming links, or the longer one on a tie), orphan pages that no other page links to (orphans, with addLine — the link line to add to a Notion-style parent or a contents page; index/README/home pages are not counted unless entryPages=false), inconsistent and outdated terms (terms: a "preferred ← variant" dictionary — your dictionary is added to the default one — plus Japanese katakana words found both with and without a final long-vowel mark, suggesting the majority form; every hit has its line and the line before/after the fix), broken links (broken: relative links with a document extension and [[Page name]] links whose target is not among the files) and a Markdown report of suggested fixes. Links are read from [text](path), [[Page name]] and <a href>, matched by relative path, title, Notion file names with their IDs and the page name at the end of Notion/Confluence URLs. Code blocks, inline code, URLs and tags are skipped for terms, and matches inside a longer word (ユーザ in ユーザビリティ, Javascript in Javascripts) are ignored. Pass paths (absolute files or folders, read recursively; hidden folders and node_modules are skipped) or files. UTF-8, Shift_JIS and UTF-16 (BOM) are detected; up to 3,000 files / 60 MB. Read-only — it never edits the filespaths? or files? ([{ path, text }]), threshold? (0.5–1, default 0.8), dictionary?, useDefaultDictionary?, autoChoon?, entryPages?, format? (both default / json / markdown), lang? (ja default / en)
fit_to_boxCharacter size and line breaks for writing a string by hand into a printed box — e.g. the address, amount and name boxes on the inner envelope (nakabukuro) of a Japanese wedding or condolence money envelope (same logic as tools.first-ch.com/en/nakabukuro-ran/). From the box width and height (mm) and direction, returns the character size that fits (mm, rounded down to 0.1 mm), the line count and each line. Size uses a 1.5 mm margin inside each side and a 0.3× line gap, limited by both line length and line count (half-width letters/digits count as 0.6 in horizontal boxes; caps of 9 mm for addresses, 14 mm for amount/name). kind: "address" breaks between the street number and the building/room first, and only when that cannot reach 4 mm also after the prefecture/city or before the street number (runs like 12番地の18 or 1203号室 are never split; a line break in text marks the building; up to 4 lines); postalCode adds a 〒 line; vertical boxes get kanji street numbers (numerals: digits = 一〇, tens = 十). Below 4 mm, alternatives gives the size and lines with the prefecture dropped and with the building on two lines (it does not decide what may be dropped); asIs is how many characters spill out when written unbroken at 5 mm. kind: "amount" writes 30000 / 3万 / 30,000円 in formal numerals (daiji) as 金参萬円 (1–99,999,999; 圓, 也 and pre-printed 金/円 supported); name breaks only at spaces; plain takes any texttext, width, height (mm), orientation? (vertical default / horizontal), kind? (address default / name / amount / plain), postalCode?, numerals?, thousandChar? (阡 default / 千 / 仟), yenChar? (円 / 圓), nari?, kinEnPrinted?, lang?
invoice_nebiki_checkFor a freelancer in Japan who is not a registered invoice issuer and is asked for a price cut (same logic as tools.first-ch.com/invoice-nebiki/). From three answers — the client's consumption tax method (general / simplified / niwari 20% rule / sanwari 30% rule / exempt / unknown), party (individual / corporation, required for the special rules) and small (is one invoice under ¥10,000 incl. tax) — returns rows per period from today: diff (monthly difference = amount × 10/110 × 20/30/50/70/100%, rounded down), none or check. The 20% rule gives no difference to 2026 for sole proprietors and to the tax period including Sep 30, 2026 for corporations; the 30% rule covers sole proprietors' 2027–2028 only; after that recheck: true (no assumption of simplified taxation). Purchases that may fall under the small-amount rule (to Sep 30, 2029) are check. Optional monthly, cutRate / cutAmount add a comparison; message asks only the open points (format: "md" for Markdown) and always carries the four assumptions; showAmount: false hides yen amounts.
reply_checkChecks an AI-drafted reply against the email it answers before you send it (same logic as tools.first-ch.com/okurumae/). From reply it picks up dates, weekdays, times, amounts, quantities (guests, nights, %), phone numbers, emails, URLs, names (〇〇様, Dear Ms. …) and other numbers; those found in neither received nor your optional facts (hours, prices, dates) are red (missing), matches are green with the matching spots in hits, and leftover placeholders ([Customer 1], 〇〇, XX, 【】, {name}) are yellow. A weekday that does not fit the date (e.g. Friday, November 8 in 2026) or a date that does not exist is red too (weekday / nodate, with the actual weekday). Dates without a year are checked in the year that falls between 60 days before and 305 days after today. Full-/half-width forms, commas, 18時30分 vs 18:30 and 3千円 vs 3,000円 are aligned for matching only — the text is never rewritten, and start/end/line/column point into reply as written. count covers every item; items stops at 500 (truncated). A note always says that 0 red does not mean the reply is correct. No auto-fix, no tone editing. Up to 20,000 characters per fieldreply, received?, facts?, today? (YYYY-MM-DD), includeGreen? (default true), lang? (ja default / en)
comfy_png_leak_scanChecks a ComfyUI PNG you received or posted for API key formats (Google AIza, OpenAI-style sk-, Anthropic sk-ant-, Hugging Face hf_, Replicate r8_) in its embedded data (same logic as tools.first-ch.com/en/comfy-key-leak/). Chunks are read in order with CRC checks; tEXt and uncompressed iTXt are searched. status is found, none (not a claim that the image is safe), unchecked (zTXt, compressed iTXt, eXIf, caBX, unknown chunks, data after IEND, over 30 MB) or failed (CRC mismatch, truncated, not a PNG). Each finding gives the place — node ID, classType and input from prompt, or node ID and widgetIndex when only a workflow exists (fieldUnknown) — plus flags for duplicate JSON keys, items outside inputs and bypassed/muted nodes. Node titles are not used. Values are never returned: only masked (first 4 characters) and length. notice is a heads-up message for the key owner (no values or file name; states that validity and cause were not checked) and revoke lists the official pages to disable each key type. With outPath it writes a copy without tEXt/iTXt/zTXt after re-reading it (0 text chunks, kept chunks byte-identical); the original is never changed, caBX (C2PA) PNGs are not rewritten. It does not test keys or fetch URLs, and sends nothing itself. Prefer path: with base64 the image bytes (including any raw key) go into the AI conversation and to the model provider, and the result carries an inputNote saying sopath (absolute) or base64, outPath?, overwrite?, includeUrl?, lang?
ai_vs_searchCompares visitors from AI with visitors from search in your own GA4 data (same logic as tools.first-ch.com/en/ai-vs-search/). Pass the CSV exported from Traffic acquisition (Session default channel group, no comparison or filter) as csv text or an absolute path; Japanese and English column names are read. Returns, for Google's AI Assistant and Organic Search rows and the total of all other channels, sessions, engagement rate (engaged sessions ÷ sessions), average engagement time per session (session-weighted) and key event rate (key events ÷ sessions — not GA4's Session key event rate), plus ratios (AI ÷ search; null under 30 AI sessions), totals.basis (matched with the grand total row / read when rows were skipped or totals differ / noTotal), excluded line numbers, notes (e.g. the period includes dates before 2026-05-13, when the AI Assistant channel was added) and a summary to paste. No outside study figures, own AI-service list or GA4 API. Local only, nothing is sent.

App tools (app_*, sent to apps.first-ch.com)

Off by default. These tools send your input to apps.first-ch.com, so they are only registered when you opt in with the environment variable FIRSTCH_ENABLE_APPS=1 (for example claude mcp add firstch-tools -e FIRSTCH_ENABLE_APPS=1 -- npx -y @first-ch/tools-mcp). Without it, every tool runs on your machine and nothing is sent anywhere.

Each app_* tool calls one app's public JSON API (POST https://apps.first-ch.com/<slug>/api/<action>, no auth; the list is in llms.txt) and returns its JSON response as is. The input is sent to apps.first-ch.com and processed there; the apps store neither the input nor the result. Apps that check a site make First CH's server request that site, so the site sees a request from apps.first-ch.com, not from you. Every app_* tool also takes lang? (ja default / en) for the language of verdicts and error messages. Calls time out after 30 s (60 s for the heavier apps and the AI apps). API errors (invalid input, unreachable site, rate limit) come back as tool errors carrying the app's error code and message.

ToolApp and what it doesMain input
app_geoGEO Checker — Enter a URL and get a six-axis, 100-point diagnosis of how citable your site is for AI search.url
app_meta_checkMeta Tag & SEO Basics Check — Enter a URL to grade its title, meta description, canonical, robots, h1, OGP, lang and viewport. Character counts and robots.txt crawlability are checked too. Pass expected (title / description / h1) to compare them with the served HTML.url, expected
app_headersSecurity Header Grader — Enter a URL to grade CSP, HSTS, X-Content-Type-Options, X-Frame-Options, Referrer-Policy and Permissions-Policy out of 100, with an A–F verdict, plain-language explanations and recommended values.url
app_sslSSL/TLS Certificate Checker — Enter a hostname and we run a real TLS handshake to read the certificate being served: expiry, days remaining, issuer, SAN and the intermediate chain, with a warning under 30 days.host
app_redirect_traceRedirect Chain Tracer — Enter a URL and we follow 301, 302, 307, 308 and meta refresh redirects one hop at a time, listing the status, URL and timing of each step, the final destination, and an SEO warning at three or more hops.url
app_status_checkBulk HTTP Status Check — Checks a list of URLs (up to 10 per call) and returns the HTTP status, response time and final URL after redirects for each one. Page bodies are not read.urls[]
app_redirect_map301 Redirect Map Checker — Checks one old→new URL pair from a relaunch or domain move: follows the old URL and checks it lands exactly on the new one, flagging temporary 302s, chains, loops, missing redirects and 404s. Call once per pair (60 pairs per minute per IP).from, to
app_link_checkBroken Link & Image Alt Checker — Enter a URL to extract its links (a href), fetch up to 40 of them and surface the broken ones, plus a list of images with missing or unhelpful alt text. Only the page you enter is examined — never a whole-site crawl.url
app_ogp_checkOGP Check (by URL) — Enter a URL to inspect its og: / twitter: tags and preview the X and Facebook cards. The og:image is fetched and measured, not just read from the markup.url
app_headingsHeading Structure (h1–h6) Extractor — Enter a URL to see every h1–h6 as an indented outline in document order. Multiple h1s, skipped levels and empty headings are flagged, and the outline copies out as Markdown.url
app_structured_dataStructured Data (JSON-LD) Extractor & Validator — Enter a URL to extract every JSON-LD block and pretty-print it by @type. Syntax errors are pinpointed with line and column, and required/recommended properties are listed for Article, FAQPage, BreadcrumbList, LocalBusiness and Organization.url
app_ai_accessAI Crawler Access Checker — Enter a URL to fetch its robots.txt and see, bot by bot, whether GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot, Bytespider and others may crawl it — including the Disallow that matched, llms.txt presence and X-Robots-Tag.url
app_robots_testerrobots.txt Tester — Enter a URL and a user-agent to fetch the site's robots.txt and rule on whether that URL may be crawled, following Google's matching rules (longest match wins, ties go to Allow). The winning rule and the rules it beat are shown with line numbers, plus syntax warnings.url, userAgent?
app_sitemap_checksitemap.xml Validator — Enter a sitemap URL to fetch it, validate the XML, and see the URL count, the spread of lastmod dates and what a sitemap index points at (one level deep). Raw & and unclosed tags are reported with line numbers; robots.txt discovery and gzipped sitemaps are supported.url
app_hreflanghreflang Return-Link Checker — Enter a URL to extract its hreflang annotations (link rel=alternate and the HTTP Link header) and verify the return links by actually fetching each declared page. Self-reference, x-default and invalid language/region codes such as en-UK or jp are checked too.url
app_mixed_contentMixed Content Checker — Enter a URL to list every http:// reference left inside an https page (img, script, link, iframe, video, source and CSS url()), with its line number, the offending tag and how to fix it. References browsers block are separated from the ones they auto-upgrade.url
app_image_auditPage Image Audit — Enter a URL to audit every img / picture on the page: format (WebP / AVIF adoption), loading=lazy, width/height attributes and alt text. For the first 30 images the real file size and served format are measured with a HEAD request.url
app_gazou_ichijouhouPhoto Location Leak Check — Pairs each JPEG on a page with its WordPress original (the URL without the -WIDTHxHEIGHT / -scaled suffix on the same server) and checks whether the Exif still holds the shooting location (GPS latitude and longitude). Each call judges five pairs from offset and returns the list of pairs (first 20), a state and reason per image and the next offset; call again until next is null. Coordinates, capture dates and image bytes are never returned, and "none" is not a guarantee.url, offset?
app_shashin_sozai_motoPhoto License Check Before Switching Web Agencies — Lists up to 30 photos in the img / srcset / picture tags of one page, flags file names in a stock-site format (currently AdobeStock_number only) and, for JPEGs, returns the creator, credit and copyright text in the XMP / IPTC of the first 128KB (up to 60 characters each). Each call judges ten photos from offset and returns the photo list, a state and reason per photo and the next offset; call again until next is null. CSS background images and images added by JavaScript are out of scope. Image bytes and the page itself are never returned, and rights or legality are not judged.url, offset?
app_hp_sumaho_checkLook at Our Site on Your Phone — 3-Question Check Card — Reads the page's HTML and up to 3 same-site stylesheets (96KB / 2,000 rules parsed in total) for three mobile points: a tel: link for every phone number in the text, sideways scrolling (viewport width=device-width, fixed width / min-width of 900px+ on body, #wrapper and similar) and text & zoom (user-scalable=no, maximum-scale=1, body / p below 12px). Each point is check / none / unknown (with reasons), with locations (HTML line, CSS file and line) and fix hints, plus up to 3 yes/no questions to ask someone checking on a real phone and a share URL with ref. No pass/fail or score, not a judgement of real rendering; the page and CSS are never returned.url
app_tech_detectTech Stack Detector — Enter a URL to infer the CMS (WordPress, Shopify, Wix, STUDIO and more), framework, CDN, analytics tags (GA4/GTM) and web fonts from HTML and header signatures — always with the evidence behind each guess.url
app_gaibu_soushinsakiThird-Party Tag Inventory — Fetches one page and matches the script src, img and iframe hosts and inline install snippets in its HTML against a table of 18 major analytics, advertising and social-embed services (Google, Meta, Microsoft, LinkedIn, LY Corporation, X). Returns the company count, per-service details (typical purpose, where to stop it, official source), discontinued services such as Universal Analytics, external hosts not in the table, and a CSV checklist. It only reads what is written in the HTML: it does not verify actual data transmission or legal compliance, and tags inside a tag manager are invisible.url
app_wp_checkWordPress Quick Audit — Enter a URL to see whether the site runs WordPress, which theme it uses, the version it announces, and whether REST API username enumeration, xmlrpc.php, author archives, the default login URL, readme.html or a debug log are exposed. Read-only GETs, never enumeration.url
app_feed_checkRSS/Atom Feed Validator — Enter a feed URL or a site URL: we discover the feed, fetch it, and validate its XML syntax, required elements, item list, character encoding and date formats (RFC 822 for RSS, RFC 3339 for Atom). Feeds using the itunes namespace also get the Apple Podcasts required-element check.url
app_favicon_checkFavicon Checker — Enter a URL to extract every icon declaration (favicon.ico, link rel=icon, apple-touch-icon and Web App Manifest icons), fetch each one and list its real format, dimensions (every size inside an ICO) and weight — with light and dark previews.url
app_dnsDNS Record Checker — Enter a domain and we query Cloudflare DoH (1.1.1.1) for its A, AAAA, CNAME, MX, TXT, NS, SOA and CAA records, then check where www points, whether SPF is published exactly once, and whether CAA exists — no dig required.domain
app_dns_propagationDNS Propagation Check — Enter a domain and a record type; we ask five public resolvers (Cloudflare, Google, OpenDNS and more) at once and line up their answers. TTL and SOA serial separate a propagation delay from a misconfiguration.domain, type?, expected?
app_email_dnsEmail DNS Checker — Enter a domain and we look up MX, SPF, DKIM and DMARC. We follow every include: to count the SPF DNS lookups against the limit of ten, explain the DMARC policy, and check it all against Google's sender guidelines (2024).domain, selector?
app_domain_infoDomain Info & Expiry Checker — Enter a domain and we query RDAP (the successor to WHOIS) for the registrar, creation date, expiry date, EPP statuses such as clientHold, and name servers. Days until expiry and renewal warnings come first. gTLD servers are resolved via the IANA bootstrap; TLDs without RDAP (including .jp) are reported as such.domain
app_domain_availabilityBulk Domain Availability Check — Enter one candidate name and we check .com, .net, .org, .jp, .co.jp, .dev, .io, .ai, .app and .co at once using RDAP and public DNS. Verdicts are three-way — registered, possibly free, inconclusive — and we never claim a name is definitely available (no affiliate links either).name
app_lookalike_domainLookalike Domain Checker — Compares a sender's address with up to 50 vendor domains you pass and flags lookalikes: romanization variants, swapped TLDs, one-letter changes and look-alike characters (including punycode). Returns where the letters differ, plus the sender domain's registration date (RDAP) and MX. Without trusted it only looks up the registration date and MX. Sends the sender address and your vendor list to apps.first-ch.com (nothing is stored).sender, trusted?
app_myipIP & Request Info — Shows the public IP, estimated country/city, network (ASN), HTTP/TLS details, User-Agent and main request headers of the request your machine sends to apps.first-ch.com. Handy for VPN checks.—
app_brand_fetchBrand Fetch — Enter a domain to extract the site's logo, favicons, main colours and company description. Colours are ranked by CSS frequency with contrast ratios on white and black — handy for placeholder branding in proposals and mock-ups.url
app_tone_checkJapanese Business Tone Check — Paste a Japanese business email or proposal to flag phrases that may read as rude, vague, double keigo or too pushy, with drop-in rewrites and cultural pitfalls for English translation (AI-generated advice). Rate-limited: 5 calls per 10 minutes per IP, and 50 calls per day shared with app_lp_persona_check.text
app_lp_persona_checkLP Copy Persona Check — Paste landing page copy and pick an industry (professional services, e-commerce or B2B SaaS) to get estimated scores and comments on clarity, trust, formality and purchase intent from three simulated Japanese buyer personas (AI-generated advice, not real customer feedback). Rate-limited: 5 calls per 10 minutes per IP, and 50 calls per day shared with app_tone_check.text, industry
app_ja_readability_checkJapanese Readability Checker — Enter a URL to check the Japanese typography of its body text: one-character orphan lines, punctuation at line start, characters per line against the 35–40 guideline and missing Japanese font fallbacks, estimated for desktop and mobile.url, cpl?
app_faq_site_diffFAQ vs Site Consistency Checker — Enter an FAQ or help page and up to three site pages to pull out prices, hours, phone numbers, dates and periods such as "within 7 days", and list every topic where the values disagree. Find outdated FAQ answers.faq, sites[]
app_nap_checkBusiness Name, Address & Phone Consistency Checker — Enter up to three pages of one site to pull the business name, address, phone and opening hours from the text, footer, tel: links and JSON-LD, and list formatting variants and possible mismatches between pages and structured data. Groundwork for local SEO. 10 calls per 10 minutes per IP.urls[]
app_henji_kuruCount LINE Attendance Replies by Pasting the Chat — AI check for the replies to a LINE group attendance call (○ going / × not going / △ not sure) that do not fit the format, such as “me too” or “absent for the previous one”. Send 1–10 rows (the reply and, optionally, the message before it) and get a category (yes / no / maybe / unclear), head count and short reason per row. The server masks phone numbers, e-mail addresses, @mentions and names before さん, but mask names yourself before sending. Tallying the whole chat runs in the browser on the page, not in this API. Shares the AI rate limits.lines[], count?

See server.mjs for the exact Zod input schemas of the local tools and apps.mjs for the app_* tools.

PDF output (marp_render) needs a local Chrome/Chromium. marp-core renders the HTML with no browser dependency (so the package stays light for npx); PDF is produced by driving a locally-installed Chrome/Chromium in headless mode. It is auto-detected on common paths, or set MARP_CHROME_PATH to the executable. If none is found, marp_render returns the HTML only and reports pdf_skipped — you can still open that HTML and print → PDF yourself (one slide per page).

Network access, files and privacy

  • Local tools vs. app_* tools. Every tool without the app_ prefix runs entirely on your machine and sends nothing anywhere. The app_* tools are the exception by design: each call sends its input (the URL, domain name, DKIM selector or text you pass) to First CH's server at apps.first-ch.com, which processes it and returns the result. The apps store neither the input nor the result; the AI apps (app_tone_check, app_lp_persona_check) pass the text to Cloudflare Workers AI and keep only a per-day call count (no text, no IP) to enforce the daily cap. Like any web request, the call reveals your public IP address to apps.first-ch.com (hosted on Cloudflare); it is used only for in-memory per-IP rate limits and is not stored. The apps that check a site fetch that site from First CH's server. The User-Agent is first-ch-tools-mcp/<version>. Don't pass anything confidential to an app_* tool, and stick to the local tools when nothing may leave your machine. FIRSTCH_APPS_BASE_URL overrides the base URL (for testing).
  • The local tools make no network requests. The only exceptions are npx downloading the package from the npm registry, and marp_render with allowRemote: true (your local Chrome/Chromium then fetches the remote images/stylesheets your Markdown references). By default marp_render loads no web fonts, keeps emoji as text, strips remote @imports from the built-in themes and runs Chrome with network access blocked and its sandbox enabled (MARP_CHROME_NO_SANDBOX=1 opts out where the sandbox cannot start, e.g. root in a container).
  • No overwriting. Tools that write files (outputPath/outputDir, webp_convert, marp_render) refuse to replace an existing file unless you pass overwrite: true. They are annotated readOnlyHint: false / destructiveHint: true; every other tool is readOnlyHint: true. The app_* tools (and marp_render) are annotated openWorldHint: true because they reach the network. marp_render without any path writes to <OS temp dir>/firstch-tools-mcp/; the server never deletes result files.
  • Privacy policy: plugins/firstch-tools/PRIVACY.md. Bugs and questions: GitHub Issues.

Telemetry

Nothing is logged by default. Usage is recorded only when you set the FIRSTCH_TOOLS_USAGE_LOG environment variable to a file path — each tool call then appends one JSON line ({ ts, tool, source }) to that local file. The log itself is never transmitted; if the variable is unset, no file is written. (This covers usage logging only — the app_* tools still send their input to apps.first-ch.com as described above.)

Web version

The same algorithms are also available as a free, no-install browser tool at tools.first-ch.com — useful when you want a UI instead of an MCP call, or want to hand a link to someone without an MCP client. The app_* tools correspond one-to-one to the web apps at apps.first-ch.com.

Vendor sync (WebP codec)

webp_convert bundles a vendored, unmodified subset of @jsquash/webp v1.5.0 under vendor/jsquash-webp/. The web version at tools.first-ch.com vendors the exact same v1.5.0 subset, so both surfaces produce identical output. Each side's CI independently verifies its vendored files against vendor/jsquash-webp/CHECKSUMS.sha256 (see .github/workflows/ci.yml), so a silent, unnoticed drift between the two copies isn't possible.

License

The package itself is licensed under MIT.

It bundles a subset of jSquash's WebP codec under vendor/jsquash-webp/ to power webp_convert, which carries its own licenses:

Both license files are included verbatim in the published npm package, as required by their respective terms (BSD-3-Clause in particular requires the copyright notice, condition list, and disclaimer to be reproduced in binary redistributions).

Development

bash
npm cinpm test        # unit tests (test.mjs) + app_* tests with a mocked fetch (test-apps.mjs; no network)node e2e.mjs     # stdio smoke test: spawns server.mjs, lists tools, calls handlers (app_* against a local fake API)

test-apps.mjs also checks that apps.mjs matches functions/_shared/apps-registry.ts of the FirstCHApps repository when it is checked out next to this one (or at FIRSTCH_APPS_REPO); otherwise that check is skipped.

CI runs both on Node 24, plus a vendor checksum check and a published-tarball content check — see .github/workflows/ci.yml.

Release rule: a push to main automatically publishes a new package version through npm Trusted Publishing (OIDC) after every CI gate passes. No NPM_TOKEN, npm login, OTP, or manual approval is used. The workflow verifies npm propagation and creates the matching vX.Y.Z tag. Package changes must bump every synchronized version field; if a version already exists with different package contents, CI fails instead of overwriting it. CI-only changes with identical package contents safely skip publishing.


日本語

@first-ch/tools-mcp は、First CH Tools(無料Webツール集)の計算ロジック — WCAGコントラスト比・日本語文字数/Xウェイト計測・WebP変換・JSON-LD生成・llms.txt生成・文字コード/改行コード変換・Marp Markdown→スライド レンダリング・テストデータ生成・テキスト/コード差分・Cron式の解説・Base64/Data URI変換・URLパラメータの分解/編集/再構築・HTML特殊文字のエスケープ/エンティティのデコード・JSON⇄YAMLの相互変換・px⇄rem/emの単位換算とCSSの一括変換・カラーコードの相互変換とアルファ透過の合成・MD5/SHA-1/SHA-256/SHA-384/SHA-512のハッシュ生成と照合・JWTのデコードと有効期限/署名の検証・User-Agent文字列の解析とデバイス判定・UUID v4 / ULIDの一括生成・アスペクト比の計算とレスポンシブサイズの算出・camelCase / snake_case / kebab-case などの文字列ケース変換・CSV/TSV ⇄ JSON の相互変換・日数/営業日の計算(日本の祝日を内蔵)・HTML→Markdownの変換・和暦⇄西暦の変換と満年齢の計算・日本語タイトルからのURLスラッグ生成 — をAIエージェント(Claude Code等)向けMCPツールとして提供するサーバーです。これらは全て端末内で処理します。

あわせて、apps.first-ch.com のWebアプリ39本(GEO・メタタグ・セキュリティヘッダー・SSL証明書・DNS/メールDNS・リダイレクト・リンク切れ・構造化データ・AIクローラー許可・和文可読性・AIによるビジネス文面/LP文言のチェックなど)を呼ぶ app_* ツールも提供します。app_* ツールは入力(URL・ドメイン名・文面)を apps.first-ch.com のサーバーへ送り、アプリの API が返した JSON を返します(端末内で完結する他のツールとはここが違います)。詳しくは 通信・ファイル・プライバシー を参照してください。

インストール

導入経路は3通りあります。使っているクライアントに合わせて選んでください。

Node.js >=24 が必要です(以下いずれの方法も npx 経由でサーバーを起動するため。Claude Code本体はNode不要のnativeインストールもありますが、その場合でもNodeは別途必要です)。

1. npm(Claude Code CLI)
bash
claude mcp add firstch-tools -- npx -y @first-ch/tools-mcp
2. Claude Code plugin(同じMCPサーバーを導入)
/plugin marketplace add First-CH/firstch-tools-mcp/plugin install firstch-tools@first-ch
3. その他のMCPクライアント(汎用JSON設定)

設定ファイル(mcp.json / claude_desktop_config.json 等)に以下を追加します。

json
{  "mcpServers": {    "firstch-tools": {      "command": "npx",      "args": ["-y", "@first-ch/tools-mcp"]    }  }}

本サーバーは MCP Registry にも io.github.First-CH/tools-mcp として登録済みです(server.json 参照)。レジストリ対応クライアントはこの名前からも発見・導入できます。

ツール一覧

ツール何をするか主な入力
contrast_check文字色と背景色のWCAG 2.1コントラスト比を計算し、AA/AAA基準(通常テキスト・大テキスト・UI部品)の合否を返すfg・bg(hex。例: #333333 / 333 / fff)
count_chars日本語テキストを書記素単位で数え、全角/半角内訳・行数・X(Twitter)投稿ウェイト(全角=2・半角=1・URL=一律23・上限280)を返すtext
webp_convertPNG/JPEG画像(絶対パス)をWebPへ変換する。tools.first-ch.com/webp/ と同一のlibwebp WASMエンコーダ(品質既定80)。出力先省略時は各入力と同じ場所に拡張子.webpで保存paths[](絶対パス)・quality?(1-100)・outputDir?
jsonld_generateschema.org準拠のJSON-LDを生成する(organization / faqpage / service / breadcrumb)。空項目は自動で省略。jsonオブジェクトと埋め込み用<script>スニペットの両方を返すtype と対応する organization / faq / service / breadcrumb オブジェクト
llmstxt_generateAI検索・生成AI向けにサイト概要を伝える llms.txt(llmstxt.org提案フォーマット準拠)を生成するsiteName・summary?・notes?・sections?
encoding_convertファイル/テキストの文字コード(UTF-8 / Shift_JIS)・BOM有無・改行コード(CRLF / LF / CR)を判定し、UTF-8へ変換する。日本語CSVの文字化け調査、改行コードの統一に。出力はUTF-8のみ(Shift_JISへのエンコードは標準APIに無く変換表が必要なため非対応)base64 または text、mode(analyze | convert)、encoding、newline、bom
marp_renderMarp Markdown をスライドへレンダリングする。テーマCSSをインラインした自己完結HTML(ブラウザで開けて、印刷すると1スライド=1ページ)と、任意でPDFを書き出す。和文テーマ firstch(紙/墨/朱・IBM Plex Sans JP が入っていれば使う)を同梱し既定テーマにする。Markdown内の Marp フロントマター(theme: / paginate: / size: / <!-- _class: lead -->)はそのまま効くmarkdown または inputPath、theme?、formats?(html | pdf)、outputPath?、title?
testdata_generateフォーム入力・CSV取り込みテスト用のダミーデータを生成する。mode=records は氏名・フリガナ・住所・郵便番号・メール・電話番号などをCSV/TSV/JSON/XLSXで返し、文字コード(UTF-8 / Shift_JIS)・BOM・改行コードを指定できる。format=xlsx は Excel ファイル本体を base64(または outputPath へ書き出し)で返す。ZIP+OOXMLを依存ライブラリなしで直接組み立てており、郵便番号・電話番号は文字列セルにするため先頭の0が消えない。mode=text は maxlength の境界値テスト用に n-1 / n / n+1 文字ちょうどの文字列を返す。生成データはすべて架空(メールは RFC 2606 の example.com 系)。seed を渡すと同じデータを再現できるmode?・rows?・fields?・format?・locale?・encoding?・newline?・bom?・header?・seed?・preset?・length?・outputPath?
diff_check2つのテキスト(またはファイル)を比較し、追加/削除/変更の行数と unified diff(.patch)を返す。tools.first-ch.com/diff/ と同一ロジック。行の対応づけは patience diff(両方に1回だけ現れる行をアンカーに分割)+アンカーの取れない範囲だけ Myers。format=blocks / both では、変更行のペアを語単位(英数字はひとかたまり・和文は1文字ずつ)でも比較し changed_parts として返すため「どの語が変わったか」まで取れる。CRLF/CR/LF は同じ行区切りとして扱い、行末の空白だけの差は既定で無視するa/b(テキスト)または pathA/pathB(絶対パス)、format?(unified | blocks | both)、context?、ignoreWhitespace?、ignoreCase?、words?
cron_explainCron式を人間向けの文へ読み下し、次回からの発火日時を返す。tools.first-ch.com/cron/ と同一ロジック。解釈は Vixie cron(crontab(5))準拠で、範囲・ステップ・列挙・JAN-DEC / SUN-SAT の名前・@daily 等の省略記法に対応し、6フィールドのときは先頭を秒として扱う(node-cron / Spring 形式)。誤りやすい点は warnings で知らせる(「日」と「曜日」の両方指定は AND ではなく OR、範囲を割り切らない */n は等間隔にならない、2月30日のような存在しない日付は発火しない)。発火日時はタイムゾーンの壁時計上で求めてから実時刻へ戻すため、夏時間のある地域でもずれないexpression、timeZone?(IANA名・既定 UTC)、count?(既定5・最大100)、from?(ISO 8601)
base64_encodeテキストやファイルを Base64・data: URI へ変換し、そのまま貼れる HTML <img> / CSS background-image のスニペットも返す。tools.first-ch.com/base64/ と同一ロジック。mode="decode" では Base64 や data URI を元のバイト列へ戻し、outputPath を渡せばファイルとして書き出す。SVGは両方のエンコードを返して短い方を既定にし(base64は必ず約1.33倍になるためパーセントエンコードの方が小さい)、& " < > # % と空白・非ASCIIを必ずエスケープするのでHTML属性にもCSSの url("…") にもそのまま貼れる。デコードは標準/URLセーフのどちらでも、空白・改行混じりでも、パディングが欠けていても読み取り、data URI が名乗るMIMEタイプより実際のマジックナンバー(PNG/JPEG/GIF/WebP/ico/PDF/zip/woff/woff2/SVG)から判定した種類を優先するmode?(既定 encode / decode)、text? または path?、base64?、outputPath?、urlSafe?、wrap?(MIMEは76)、dataUri?、mimeType?、snippets?
url_paramsURLのクエリ文字列をキーと値へ分解し、編集(set / remove / utm / removeTracking / sort)して再構築する。tools.first-ch.com/url/ と同一ロジック。値はデコードして返し(%XX を元の文字へ、+ を半角スペースへ)、触っていないパラメータは生の文字列のまま書き戻すため、url だけを渡した場合の出力は入力と1バイトも変わらない(署名付きURLを通しても壊れない)。reencode を立てると全体を encodeURIComponent の規則へ正規化する。warnings では重複キー・未エンコードのスペースや非ASCII・壊れた %XX・+ のスペース解釈・UTM値の大文字混在・utm_source/utm_medium の片落ち・URL内のパスワード・トークンらしきキー・2000文字超を知らせる。相対パスや壊れたパーセントエンコードでも例外にせず読める範囲まで分解する。mode="encode" / "decode" では文字列単体を変換する(scheme: component / uri / form)。URLへのアクセスは行わないurl?、mode?(既定 parse / encode / decode)、text?、scheme?、set?、remove?、utm?、removeTracking?、sort?、reencode?、spaceAsPlus?
html_escapeテキスト中の < > & " ' をHTMLエンティティへ変換し、mode="unescape" では &amp; &#39; &#x3042; などの文字参照を元の文字へ戻す。tools.first-ch.com/html-escape/ と同一ロジック。エスケープは & を最初に処理するため、1回目の出力をもう一度通しても二重エスケープにならない。名前付きと数値文字参照の切り替え(numeric)、引用符を変換するか(quotes・属性値へ入れるなら必須)、' を &#39; と &apos; のどちらで書くか(apos・&apos; はHTML 4.01に無い)、非ASCII文字を参照にするか(nonAscii・文字コードが伝わらない経路への保険)を選べる。デコードはHTML 4.01の名前付き文字参照252個すべてと10進/16進に対応し、&#128; のようなC1領域の参照は仕様どおり Windows-1252 の文字へ読み替え、知らない名前・範囲外の数値・セミコロン無しの参照は推測で変換せずそのまま残す。notes ではすでにエスケープ済みの入力・裸の &・セミコロンの閉じ忘れ・知らないエンティティ名・ノーブレークスペース(U+00A0)の混入を知らせるmode?(既定 escape / unescape)、text? または path?、outputPath?、quotes?、apos?、numeric?、nonAscii?(none / named / decimal / hex)
json_to_yamlJSONをYAMLへ変換して整形する(逆向きは yaml_to_json)。tools.first-ch.com/json-yaml/ と同一ロジックで、YAMLの解析・生成もこのパッケージ内に実装しており外部のYAMLライブラリには依存しない。インデント幅・引用符の付け方(quote)・nullの書き方(nullStyle)・複数行文字列をブロックスカラー ` で書くか(block)・キーを名前順に並べるか(sortKeys)・先頭に --- を付けるか(docStart)を選べる。別の型に読まれうる文字列(yes/no/on/off・0755・12:30・2026-08-12・数値に見える文字列)、前後に空白がある文字列、-/*/# で始まる文字列は自動で引用符を付けるので、YAML 1.1 のパーサ(PyYAMLなど)に渡しても意味が変わらない。コメント・末尾カンマ・シングルクォート・引用符なしのキーを含むJSON(tsconfig.jsonなど)も読み取って変換し、JSONとしては不正であることをnotes で知らせる(relaxed=false` で厳密に拒否できる)
yaml_to_jsonYAMLをJSONへ変換する。docker-compose・GitHub Actions・Kubernetes・CIの設定をプログラムから扱える形へ読み替えるときや、構文が通るかを確かめるときに使う。構文エラーは「何行何桁・原因・直し方」と前後2行の抜き出し(桁を指す ^ つき)をエラーとして返す。複数ドキュメント(---)はJSONの配列1つにまとめ、アンカー &名前・エイリアス *名前・マージキー << はJSONに参照の仕組みが無いため展開する(展開したことは notes で知らせる)。スカラーの解釈は YAML 1.2 core schema なので yes / no / on / off / NO は文字列のままだが、notes でそれを知らせる。0755(8進数ではなく10進の755になる)・12:30(YAML 1.1では60進数の750)・日付に見える値・キーの重複・2の53乗を超える整数も同様。ブロックマップ/シーケンス・フロー表記・引用スカラー(複数行・エスケープ)・ブロックスカラー(` > と chomping・明示インデント)・タグ(!!str !!int !!float !!bool !!null !!binary)・コメントに対応し、未対応は「? キー`」の明示キー記法のみ
px_rem_convertCSSの長さの単位を px ⇄ rem / em / pt で換算する。tools.first-ch.com/px-rem/ と同一ロジック。value を渡すと1つの値の換算になり、px・rem・em・pt の値、そのまま貼れる font-size の1行、よく使うフォントサイズのスケール表(12〜64pxの15段・用途の目安つき)を返す。css / path を渡すとCSS全体の一括変換になる(direction: 既定 px2rem / px2em / rem2px / em2px)。一括変換ではコメント・文字列(content: "10px")・url() の中身と、--size-16px のように識別子の一部になっている数字は書き換えない。既定は minPx=2 で1pxの罫線を残し(remにすると環境によって太さがばらつくため)、ブレークポイントが書かれる @media などアットルールの条件も変換しない(skipMedia)。ignoreProps は前方一致でプロパティを除外し、zeroUnitless は 0 を単位なしで書き出す。ルートは root="62.5%" のようにパーセントでも指定でき(ブラウザ既定16pxに対する割合として10pxと読む)、丸めが起きたこと・変換しなかった箇所・62.5%テクニックのアクセシビリティ上の副作用は notes で返るvalue?(24 / "1.5rem")または css? / path?、unit?、outputPath?、direction?、root?、parent?、precision?(auto または 0-6)、minPx?、zeroUnitless?、skipMedia?、ignoreProps?、scale?
color_convert色のコードを HEX / RGB / HSL / OKLCH で相互変換し、アルファ付きの rgba() / hsla() / 8桁HEX を作る。tools.first-ch.com/color/ と同一ロジック。入力は HEX(3/4/6/8桁)・rgb()・hsl()・hwb()・oklch()・oklab()・CSSの名前付き色(148色)・transparent に対応し、旧記法のカンマ区切りと新記法のスラッシュ区切り、角度の単位(deg / grad / rad / turn)も読む。background を渡すと、透過色をその背景の上に重ねたときに実際に見える色(前景×α + 背景×(1−α))を flattened で返すので、デザインカンプの半透明レイヤーを実装で不透明なHEXへ置き換えるときに使える。あわせて白・黒とのWCAG 2.1コントラスト比、step%刻みの alpha_table、色相と彩度を保ったまま明度だけを50〜950の11段に振った palette を返す。sRGBの範囲外のOKLCHは、RGBを切り詰めると色相までずれるため、明度と色相を保ったまま彩度だけを二分探索で下げて収める(収めたこと・名前付き色と完全一致したこと・無彩色であることは notes で知らせる)color、alpha?(0〜1・0〜100・"50%")、background?(既定 #ffffff)、syntax?(既定 modern / legacy)、uppercase?、alphaPercent?、step?(1〜50・既定10)、alphaTable?、palette?
hash_generateテキストまたはファイルの MD5・SHA-1・SHA-256・SHA-384・SHA-512 ハッシュ値を一度に算出する。tools.first-ch.com/hash/ と同一の仕様。expected に期待値を渡すと桁数から対象のアルゴリズムを判定して照合し、一致したかどうかを verification で返す。expected はコマンドの出力をそのまま渡せる(sha256sum の <ハッシュ値>␣␣<ファイル名>・shasum -a 256 の出力・SHA256 (file) = …・sha256: のような接頭辞・コロン区切りの16進・Base64 / base64url)。出力は既定が16進の小文字で、HEX / base64 / base64url も選べる。text では newline(lf / crlf)と bom で実際にハッシュへ渡すバイト列を決められるので、Windowsで作られたファイルの値も再現できる(文字コードはUTF-8固定)。path にはどちらも影響せず中身をそのまま読み、大きなファイルは1パスのストリームで処理する。MD5とSHA-1が衝突耐性を破られていること・ハッシュ値をそのままパスワード保存に使ってはいけないことは notes で知らせるtext? または path?、algorithms?(既定 ["md5","sha1","sha256","sha512"])、format?(既定 hex / HEX / base64 / base64url)、newline?、bom?、expected?
jwt_decodeJWT(JSON Web Token)をデコードしてヘッダーとペイロードを返し、有効期限を判定する。tools.first-ch.com/jwt/ と同一の仕様。token は Authorization: Bearer <token> の1行のまま渡せる(ヘッダー名・Bearer・前後の引用符・末尾のカンマ・途中の改行は取り除く)。expiry では状態(valid / expired / not_yet / no_exp)・exp / nbf / iat のISO日時・残り秒数・有効期間のどこまで来ているかを返す。clockTolerance で時計のズレを許容でき、now に判定時刻を渡せば結果が再現できる。key を渡すと Web Crypto で署名も検証する: HS256/384/512 は共有鍵の文字列(keyEncoding で base64url / hex も可)、RS・PS・ES・EdDSA は SPKI形式のPEM公開鍵かJWK / JWKSのJSON(JWKSはヘッダーの kid で選ぶ)。秘密鍵・証明書・PKCS#1 を渡した場合は検証せず、変換コマンドを案内する。warnings は alg: none・署名なし・期限切れ・まだ有効前・exp がミリ秒(Date.now() の1000割り忘れ)・アクセストークンとして長すぎる有効期間・ペイロードに残った秘密情報や個人情報(base64url は暗号化ではないので、トークンを持つ人は誰でも読める)を指摘する。5セグメントのJWEはヘッダーのみ返し(復号はしない)、ネットワークへは一切出ない(JWKSは呼び出し側が渡す)token、key?、keyEncoding?(既定 utf8 / base64url / base64 / hex)、clockTolerance?(秒)、now?(UNIX秒)
user_agent_parseUser-Agent文字列から、ブラウザ名とバージョン・レンダリングエンジン・OSとそのバージョン・デバイス種別(desktop / mobile / tablet / tv / console / wearable / bot)・メーカーと機種・CPUアーキテクチャを判定する。tools.first-ch.com/user-agent/ と同一の仕様。ua はアクセスログの行のまま渡せる(先頭の User-Agent:・前後の引用符・末尾のカンマは取り除く)。判定は「より限定的なトークンから先に試す」順序で行う(Edg/ → OPR/ → Chrome/ → Safari/)。Chrome・Edge・Opera はいずれも Chrome/ と Safari/ を名乗るため、部分一致では必ず取り違えるからである。tokens ではUA文字列をトークン単位に分解し、Mozilla/5.0・KHTML, like Gecko・Mobile/15E148 といった化石の意味を返す。notes では「UAでは分からないこと」を知らせる: Chrome 110以降の削減済みUA(マイナー版は 0.0.0、Androidの機種名は K に凍結)・macOSが常に 10_15_7 を名乗ること・Windows 10と11が区別できないこと・iPadがMac版Safariと同じUAを送ること・アプリ内ブラウザ(LINE / Instagram / Facebook / Android WebView)・そしてUAは自己申告なのでアクセス制御の根拠にしてはいけないこと。Googlebot・bingbot・GPTBot・ClaudeBot・PerplexityBot などのクローラーや curl・python-requests・axios のHTTPクライアントも判定する。uas に配列を渡すと複数件をまとめて解析し、ブラウザ・OS・デバイス種別の内訳を summary で返すua? または uas?(配列)、includeTokens?(既定: 20件以下なら含める)
uuid_generateUUID v4 または ULID を1〜100件まとめて生成する。tools.first-ch.com/uuid/ と同一の仕様。UUID v4 は128bitのうち122bitが乱数(残る6bitがバージョンとバリアント)、ULID は26文字で先頭10文字が生成時刻(UNIX時間のミリ秒・48bit)・後ろ16文字が乱数(80bit)で、表記は Crockford's Base32(紛らわしい I・L・O・U を除く)。ULIDは時刻が先頭にあるため文字列の辞書順が生成順と一致し、timestamp(ISO8601 / UNIX秒 / UNIXミリ秒)で時刻を固定すれば出力を再現できる。同一ミリ秒内に複数生成するときは ULID 仕様の単調増加(monotonic)に従って乱数部を+1するので、100件を一度に作っても順序が崩れない。乱数は node:crypto の randomBytes(CSPRNG)で、Math.random は使わない。format で text の形(1行1件 / JSON配列 / カンマ区切り / SQLの INSERT 向けの引用符付き)、uppercase / hyphens / braces で表記(UUIDの既定は RFC 9562 に従い小文字・ULIDの既定は大文字。hyphens: false はMySQLの BINARY(16) 向けの32文字、braces: true はWindowsのGUID表記)を選べるtype?(uuid | ulid)、count?(1〜100)、format?、uppercase?、hyphens?、braces?、timestamp?(ULIDのみ)
aspect_ratio_calcアスペクト比と寸法を相互に計算する。tools.first-ch.com/aspect-ratio/ と同一の仕様。ratio(16:9 / 16/9 / 16x9 / 1.85 のような小数)と width か height の片方を渡すと、もう一方の寸法に加えて約分した比率・小数・padding-top の百分率・aspect-ratio の1行を返す。ratio を省いて width と height を渡すと逆向きに働き、最大公約数で約分した比率・向き・画素数・いちばん近い定番比率(16:9・4:3・3:2・1:1・4:5・9:16・21:9・1.85:1・2.39:1・OGPの1.91:1・黄金比・A判用紙)とのずれ(%)を返す。1920×1080 のように名前のある寸法はその名前も返す。round で 四捨五入・偶数・切り捨て・切り上げ を選べ、丸めた場合は丸め後の実際の比率とそのずれを notes で知らせる(H.264 / H.265 は色情報を縦横半分の解像度で持つ=YUV 4:2:0 ため、動画には round: "even" が要る)。box を渡すとその枠へ contain / cover ではめ込んだときの描画サイズ・拡大率・上下左右の余白(レターボックス / ピラーボックス)・切り取られる量・見える割合を返す。widths(または table: true)でブレークポイントごとの高さの早見表を、snippet: true でCSS(@supports で囲んだ padding-top のフォールバックも任意で付く)と、CLSを防ぐ width / height 属性入りのHTMLを返すratio? および width? / height?、round?(既定 none / round / floor / ceil / even)、widths?、table?、box?("1280x400")、fit?(既定 cover / contain)、snippet?、selector?、target?(img / video / iframe / background)、objectFit?、fallback?
markdown_tableExcelやスプレッドシートからコピーしたTSV/CSVをMarkdownの表へ整形し、逆にMarkdownの表をCSV/TSV/HTML/JSONへ書き出す。tools.first-ch.com/markdown-table/ と同一の仕様。表計算ソフトで範囲をコピーしたときのクリップボードはカンマ区切りではなくタブ区切りなので、タブ・カンマ・セミコロンのそれぞれで実際に読んでみて「列数がいちばん揃うもの」を選ぶ方式で自動判定する(金額の桁区切り 1,200 で列がずれない)。CSVはRFC 4180の引用符(セル内のカンマ・改行・二重引用符)に対応。桁揃えでは全角文字をUnicodeのEast Asian Widthに従って2桁として数えるので、等幅フォントで縦線が揃う。空でないセルがすべて数値(桁区切り・小数点・通貨記号・%・単位を含む)の列は自動で右寄せ(---:)にし、aligns で列ごとに上書きできる。セル内の `は|へ、セル内の改行は
(または半角スペース)へ置き換え、列数が足りない行には空セルを補い、直した内容は黙って処理せず notes で返す。Markdownを読むときは区切り行のコロンから配置を読み取り、
` は改行へ戻すので、CSVへ書き出せば表計算ソフトへそのまま取り込める
sql_format1行に固まったSQLを、予約語の大文字化・句ごとの改行・字下げの付いたクエリへ整形する。tools.first-ch.com/sql-format/ と同一の仕様。SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY / LIMIT / INSERT INTO / VALUES / UPDATE / SET / DELETE FROM / WITH / UNION などの句を行頭へ、その中身を1段下げて並べ直す。JOIN は行頭に置いて ON を1段下げ、AND / OR は条件ごとに改行する(BETWEEN a AND b の AND は条件の区切りではないので改行しない)。( の直後が SELECT / WITH / VALUES のときだけサブクエリとみなして改行+字下げし、関数呼び出し(SUM(…) / IN (1, 2, 3) / OVER (PARTITION BY … ORDER BY …))は1行のまま保つ。CASE 式は WHEN / ELSE / END を縦に並べる。予約語と型名だけを大文字(または小文字)へ揃え、テーブル名・列名・別名の綴りは変えない(識別子の折りたたみ方がDBごとに違うため)。文字列・引用符付き識別子("…" / `…` / […])・コメント・プレースホルダ(? / :name / $1 / @var)はそのまま残す。WHEREの無いUPDATE/DELETE・閉じていない括弧や引用符・SELECT *・暗黙の結合・プレースホルダの有無は notes で返す。compact を立てると逆に1行へ畳む。特定DBのパーサーではなく字句ベースの整形器なので、MySQL・PostgreSQL・SQL Server・SQLite・Oracle の方言も壊さずに通す(構文エラーの検出はしない)text か path、outputPath?、keywordCase?(既定 upper / lower / preserve)、functionCase?、indent?(2 / 既定 4 / 8 / tab)、commaStyle?(既定 trailing / leading)、logicStyle?(既定 leading / trailing)、breakColumns?、breakLogic?、breakOn?、breakCase?、breakSubquery?、expandClauses?、compact?、eol?
qr_generateURL・テキストからQRコードを作り、SVG(ベクター)・PNG・端末に貼れる文字の図で返す。tools.first-ch.com/qr/ と同一の仕様。符号化(数字 / 英数字 / UTF-8のバイトモードを入力に応じて自動選択)・リード・ソロモン符号による誤り訂正・位置検出/タイミング/位置合わせパターンと型番情報の配置・8種類のマスクからの自動選択まで自前で実装しており(JIS X 0510 / ISO 18004・型番1〜40)、外部のAPIも画像生成サーバーも使わない。ecLevel は容量と汚れへの強さの取引(L 約7% / M 約15% / Q 約25% / H 約30%。印刷物はQ以上を推奨)、size は出力の一辺(px)、margin は余白=クワイエットゾーンのモジュール数(規格の推奨は4。0にすると背景の柄によっては読めなくなる)。Wi-Fi(WIFI:T:WPA;S:…;P:…;;)・mailto:・tel:・SMSTO:・geo: はその文字列をそのまま text に渡す。outputPath を渡すとファイルへ書き出す(本文は返さない)。format="png" で省いた場合は data URI で返る。容量の上限は数字7089桁・英数字4296文字・バイト2953文字(いずれもレベルL)text、ecLevel?(L / 既定 M / Q / H)、size?(64〜4096・既定 320)、margin?(0〜32・既定 4)、format?(既定 svg / png / text)、mode?(既定 auto / numeric / alnum / byte)、mask?(0〜7)、minVersion?、outputPath?
unixtime_convertUNIX秒・ミリ秒・マイクロ秒・ナノ秒と、ISO 8601や日時文字列を相互に変換する。tools.first-ch.com/unixtime/ と同一の仕様。数値の単位は桁数から自動判定し(10桁までを秒 / 13桁までをミリ秒 / 16桁までをマイクロ秒 / それ以上をナノ秒)、unit を渡せばその単位で読む。ミリ秒より下の桁は切り捨て、その旨を notes で返す。日時側は 2026-08-24T09:30:00Z(ISO 8601)・2026-08-24 18:30・2026/8/24 9:05・2026年8月24日 18時30分・Sun, 24 Aug 2026 03:00:00 GMT(HTTP-date)・now を受け付け、CSVやJSONから貼ったときの引用符・角括弧・行末カンマは自動で外す。input は1行1件で最大500行までまとめて変換し、行ごとにUNIX秒・ミリ秒・ISO 8601(UTC)・timeZone の現地時刻(曜日・UTCオフセット付き)・相対表示(○分前 / ○日後)を返す。読めなかった行は他の行を巻き込まずその行だけ error になる。オフセットを持たない日時は timeZone の壁時計として解釈し、必ず notes で明示する(入力に +09:00 や Z があればそちらが優先)。夏時間で存在しない時刻は切り替え後へ繰り上げ、これも notes に出す。8桁の数字(20260824)はUNIX秒として読むため、日付のつもりの入力には注意を返す。負の値(1970年より前)と小数点付きの秒にも対応input、timeZone?(IANA名・既定 UTC)、unit?(既定 auto / s / ms / us / ns)、now?(UNIXミリ秒か日時文字列・既定は実行時刻)、lang?(既定 ja / en)
robotstxt_generateクロールの許可/禁止ルール・サイトマップ宣言・AIクローラーの許可プリセットから robots.txt を組み立てる。tools.first-ch.com/robots-txt/ と同一の仕様。ai.preset で24種のAIクローラーの扱いをまとめて決められる: training(既定=GPTBot・ClaudeBot・Google-Extended・Bytespider・CCBot など学習用データを集めるクローラーだけを拒否し、OAI-SearchBot・Claude-SearchBot・PerplexityBot・ChatGPT-User などAI検索と都度取得は許可)/ allow / block / none(AIクローラーを書かない)/ custom(ai.overrides で1件ずつ指定)。クローラーは自分に一致するグループを1つだけ読むため、GPTBot 用のグループを作った時点で User-agent: * の禁止ルールはそのクローラーへ届かなくなる。既定では共通の禁止パスをAI側のグループへ書き写してこの取りこぼしを防ぐ(ai.inherit: false で止められる)。パスは先頭の / を補い、絶対URLからはパス部分だけを取り出す。warnings では空白を含むパス・パーセントエンコードしていない日本語のパス・対応していないクローラーのあるワイルドカード・Googlebotが読まない Crawl-delay・サイトマップの宣言漏れ・同じUser-agentの重複・サイト全体の拒否を指摘する。listCrawlers: true を渡すと生成せずAIクローラーの一覧(名前・提供元・目的)だけを返すsiteUrl?、disallow?、allow?、userAgents?(既定 *)、crawlDelay?、blockCrawlers?、sitemaps?、ai?(preset? / overrides? / inherit?)、groups?、comments?(既定 true)、allowStyle?(既定 disallow-empty / allow-slash)、listCrawlers?、lang?(既定 ja / en)、outputPath?
case_convert識別子を camelCase / PascalCase / snake_case / CONSTANT_CASE / kebab-case・Train-Case・dot.case・Title Case・Sentence case・lower case・UPPER CASE の11形式へ相互変換する。tools.first-ch.com/case/ と同一ロジック。変数名の一括リネーム、snake_case のDB列名と camelCase のJSONキーの読み替え、CSVヘッダーの整形といった、層の境目で発生する定型処理のための道具。scope で処理の単位を選ぶ: lines(既定=1行1件)/ items(行内のカンマ・タブ区切りで1件ずつ=CSVヘッダー)/ whole(全体で1件)。前後の空白・インデント・改行コード(LF/CRLF)・区切り記号はそのまま残すので、名前だけが置き換わる。大文字の連なりは直後に「大文字+小文字」が続くときだけ手前で切り(XMLHttpRequest → XML / Http / Request)、数字は既定で直前の語へ付く(sha256Hash → sha256 / Hash。splitDigits で分けられる)。頭字語は既定で parseXmlData へ畳み、keepAcronyms で parseXMLData のまま残す(camelCase の先頭語はどちらでも小文字=URLParser → urlParser)。大文字小文字を持たない文字(日本語など)はそのまま出力し、ローマ字化はしない。notes では変換後に同じ名前へ衝突する項目(first name と first_name はどちらも first_name=インポート時に片方が黙って消える事故の元)・数字で始まって識別子にできない結果・頭字語を含む項目を指摘し、items[].detected では各入力がどの形式で書かれていたかを返す。allFormats で各項目を11形式すべてへ展開、listFormats で形式の一覧と使いどころだけを返すtext? または path?、outputPath?、format?(既定 camel)、scope?(既定 lines / items / whole)、splitDigits?、keepAcronyms?、allFormats?、listFormats?、lang?(既定 ja / en)
csv_convertCSV/TSVとJSON配列を相互変換する。tools.first-ch.com/csv-json/ と同一ロジック。表計算ソフトから書き出した表をAPIに渡せるJSONにする、逆にAPIの応答をExcelで開ける表にする、という手持ちのデータを形式だけ移し替えるための道具。direction を省くと、入力の先頭が [ か { なら json2csv、そうでなければ csv2json と推定する。区切り文字は先頭20行で「どの記号が各行に同じ個数だけ現れるか」を見て自動判定し、delimiter で固定もできる。stock.qty のような列名は入れ子のオブジェクトとして読み書きし、tags.0 / tags.1(tags[0] も同義)は配列になる。逆向きも同じ規則で平らにするので、CSVへ出してJSONへ戻すと元の構造に復元される(nest: false なら入れ子はJSONの文字列としてセル1つに入る)。型の読み替えは「一度数値にして文字列へ戻したとき元の表記と1文字も違わないか」で決めるため、0123・+1・1.50・2の53乗を超えるID(12345678901234567890)は文字列のまま残り、郵便番号・電話番号・伝票番号・バージョン番号が壊れない。読み取りは RFC 4180 準拠で、引用符・"" エスケープ・セル内改行・CRLF・BOM に対応する(書き出し側は Excel 向けに bom と newline を選べる)。JSONは配列・単体のオブジェクト・{"data":[…]} のように配列を包んだもの・1行1件のJSON Lines を受け取れる。JSONの構文エラーは例外にせず、行・桁と前後の抜粋を持つ ok: false の結果として返すので、応答そのものが直しどころになる。notes では、列数が見出しと合わない行・重複した列名(name_2 として残す)・空の見出し(column4 を割り当てる)・桁落ちする数値・= + - @ で始まり表計算ソフトが数式として実行しうるセル(CSVインジェクション)・キーの並びが揃わないオブジェクトを指摘するtext? または path?、outputPath?、direction?(既定 auto / csv2json / json2csv)、delimiter?(既定 auto / comma / tab / semicolon / pipe)、header?、nest?、types?、trim?、emptyNull?、indent?(既定 2 / 0〜8 / tab)、newline?(既定 lf / crlf)、quoteAll?、bom?、lang?(既定 ja / en)
zenkaku_convert英数字・カタカナ・記号・スペースを文字種ごとに向きを選んで全角⇄半角へ変換し、あわせて空白まわりを掃除する。tools.first-ch.com/zenkaku/ と同一ロジック。顧客支給原稿の表記統一、CSV取り込み前の正規化、フォーム入力値の掃除のための道具。alnum / kana / symbol / space にそれぞれ keep(そのまま)/ han(半角へ)/ zen(全角へ)を渡す。既定は日本語の原稿で最も多い「英数字・記号・スペースは半角、カタカナは全角」(preset: 'ja' と同じ)。preset は ja / csv(ja に空白の掃除と見えない文字の除去を足したもの)/ han / zen で、個別指定が優先される。半角カタカナは1文字ではないため、半角→全角では次が濁点なら1文字へ合成し(ガ→ガ・パ→パ・ヴ→ヴ)、全角→半角では2文字へ分解する。句読点・カギ括弧・中黒・長音(。 、 「 」 ・ ー)は半角カタカナのブロック(U+FF61〜U+FF9F)に同居しているのでカタカナと同じ文字種として扱う(kana: 'han' は 「テスト」。 を 「テスト」。 にする。句読点を全角で残すなら keep)。スペースは U+3000 ⇄ U+0020 に加え、NBSP や欧文の各種スペースも半角側へ寄せる。掃除は collapseSpaces(連続する空白を先頭の1文字へ)・trimLines・blankLines(keep / collapse / remove)・removeInvisible(ゼロ幅・BOM・制御文字)・composeMarks(NFC。ガ が カ+結合文字 U+3099 で書かれた原稿向け)。改行コード(LF/CRLF)とタブ、ひらがな・漢字は書き換えない。 notes では出力に残った半角カナ・全角スペース・見えない文字・結合文字の濁点に加え、波ダッシュ 〜(U+301C)/全角チルダ ~(U+FF5E)と環境依存文字(① ㈱ Ⅲ)を指摘する(後の2つはどちらへ寄せるべきかが届け先で変わるため指摘のみで自動変換しない)。NFKC正規化とは別物で、① が 1 になることはなく、選んだ文字種しか触らない。inspect: true なら変換せず点検結果だけを返すtext? または path?、outputPath?、preset?(ja / csv / han / zen)、alnum?、kana?、symbol?、space?(いずれも keep / han / zen)、collapseSpaces?、trimLines?、blankLines?(既定 keep / collapse / remove)、removeInvisible?、composeMarks?、inspect?、lang?(既定 ja / en)
cidr_calcCIDR表記・サブネットマスク・ACLのワイルドカードマスク・単体のIPから、ネットワークアドレス・ブロードキャスト・使えるホストの範囲・アドレス数とホスト数・逆引きゾーン・2進表記を返す。tools.first-ch.com/cidr/ と同一ロジック。サーバー設定・ファイアウォール・Basic認証の許可リストを書くときのサブネット計算のための道具。IPv4とIPv6の両対応で、:: の省略・末尾のIPv4表記(::ffff:192.168.0.1)・[...] 囲み・%zone を読み、出力は RFC 5952 に従う。192.168.1.5 255.255.255.0 や 192.168.1.5/0.0.0.255(ACLの書き方)も同じ入力欄で受け取る。ホスト数の例外も織り込む: /31 は点対点リンクとして2アドレスとも使え(RFC 3021)、/32 は1台、IPv6にブロードキャストは無い。渡したアドレスのホスト部にビットが立っていれば、notes で設定ファイルに書くべき本来のCIDRを返す。先頭に0の付いたオクテット(192.168.001.1)は受け取らない(8進数として読む実装があり、同じ表記が別のアドレスになるため)。アドレス帯は IANA の主要な予約ブロック(プライベート・CGNAT・ループバック・リンクローカル・文書用・マルチキャスト・ULA ほか)と照合して種別を返し、ネットワークがその帯からはみ出す場合も指摘する。split はそのプレフィックス長で均等に割った一覧、contains は各アドレスがそのネットワークに入るかの判定、range は 10.0.0.5 - 10.0.0.200 のような範囲(CIDR・単体IPと混ぜて1行1件か ; 区切り)を重なりと隣接をまとめたうえで過不足なく覆う最小個数のCIDRへ逆算する。計算はすべてBigIntcidr? と/または range?、split?(プレフィックス長)、contains?(文字列の配列)、limit?(1〜4096・既定 256)、lang?(既定 ja / en)
date_calc2つの日付の間の日数・営業日数、起点日から N日後/N営業日後の期日、締め日と支払サイトからの支払日を計算する。tools.first-ch.com/date-calc/ と同一ロジック。納期・検収期限・支払サイトの確認のための道具。営業日は「土日・日本の祝日・指定した休業日を除いた日」で、祝日は内閣府「国民の祝日について」の一覧をパッケージに同梱している(1970年〜2027年)ため、ハッピーマンデーで動く祝日・日曜と重なったときの振替休日・前後を祝日に挟まれた国民の休日(2026-09-22)・年によって変わる春分の日/秋分の日がすべて計算に入る。mode="between" は暦日数・営業日数・休みの内訳・期間内の祝日一覧を返す。mode="add" は base から n(負なら過去へ)を unit の単位で進めた期日と、飛ばした休みの一覧を返す。「受領後10営業日」は初日を数えるかで1日ずれるので、民法の原則どおり翌日起算を既定とし、include_start=true で起点日を1日目として数える。mode="payment" は invoice・closing・pay_months・pay_day から支払日を求め、休みに当たったら pay_adjust(既定 prev=前営業日へ繰り上げ・日本の商慣習)で寄せる。週の休み・年末年始・自社の休業日・休日出勤も指定できる。日付は「1970-01-01からの通算日」の整数で扱うのでサーバーのタイムゾーンで1日ずれないmode?(between / add / payment)、start?、end?、base?、n?、unit?(既定 business / days / weeks / months / years)、include_start?、adjust?、invoice?、closing?(既定 eom / 1〜31 / none)、pay_months?、pay_day?、pay_adjust?、weekend?、holidays?、year_end?、closed_dates?、work_dates?、lang?
html_to_markdownHTML断片をMarkdownへ変換する。tools.first-ch.com/html-md/ と同一ロジック。取得したページの本文をLLMへ渡す前の後処理、既存サイトの原稿をMarkdown管理へ移す移行作業のための道具。見出し(h1〜h6)・段落・改行・強調・取り消し線・リスト(入れ子・start 属性・チェックボックス)・表(thead / caption と align・text-align による列の配置)・リンク・画像・コードブロック(class="language-*" から言語を拾う)・引用・水平線・定義リスト・figure / figcaption・details / summary に対応し、script・style・hidden や display:none の要素・装飾のための div / span は自動で取り除く。HTMLの解釈にブラウザのDOMを使っていない——字句解析も木の組み立ても自前なのでWeb版と結果が一致し、閉じ忘れたタグは末尾で閉じ、行き場のない閉じタグは捨てて変換を続ける(補った件数は必ず notes で返す)。属性の引用符が閉じていない場合だけは打ち切る——続けると残りの文書全体を1つの属性値として飲み込むため。Markdownに書けないものは黙って捨てず報告する: セルの結合(colspan は空セルで埋め、rowspan は先頭行にだけ値が入る)・セル内のリスト/コードブロック(その表だけHTMLのまま残す)・定義リスト(Markdown Extra の : 記法)・sup / sub / mark / iframe / svg(unknown で「HTMLのまま残す/文字だけ残す/取り除く」を選ぶ)。表・タスクリスト・取り消し線はGFMの拡張なので gfm=false で切れる。base_url を渡すと相対URLのリンクと画像を絶対URLへ直し(移行でいちばん壊れるところ)、main_only=true は main / article の中だけを取り出して header・nav・footer・aside・form を落とす。ネットワークへは出ない(ページの取得は呼び出し側の仕事)html? または path?、outputPath?、main_only?、base_url?、gfm?、escape?、pad_tables?、headings?(既定 atx / setext)、bullet?(- / * / +)、code_block?(fenced / indented)、links?(inline / reference / strip)、images?(keep / alt / drop)、tables?(gfm / html)、unknown?(keep / text / drop)、br?(spaces / backslash / html / space)、lang?(既定 ja / en)
wareki_convert和暦(令和・平成・昭和・大正・明治)と西暦を相互に変換し、曜日と干支を返す。tools.first-ch.com/wareki/ と同一ロジック。契約書・請求書・行政書類の日付の変換と検算のための道具。mode="convert" は date か dates(1000件まで)を受け、西暦か和暦かを自動で見分ける(2026-10-01・2026/10/1・20261001・2026年10月1日・令和8年10月1日・R8.10.1・令和八年十月一日・㋿8.10.1・Reiwa 8 など)。年だけ(1989・昭和64年)・年月だけ(2019-05)も変換でき、改元をまたぐときは両方の元号を返す。formats に和暦(元年表記・曜日つき・漢数字)・略記(R8.10.1/R08.10.01)・西暦・ISO 8601・英語を返す。存在しない和暦(平成32年・平成31年5月1日・令和元年4月30日)も西暦へ直したうえで正しい和暦を notes で指摘し、書き添えの曜日が実際と違えば WEEKDAY_MISMATCH を返す。明治5年(1872年)以前は旧暦のため年単位でだけ換算する(LUNAR_CALENDAR)。mode="age" は birth(和暦可)と reference(省略時は日本時間の今日)から満年齢(誕生日に1つ増え、2月29日生まれは平年だと3月1日)・年月日の内訳・数え年・次の誕生日と、小学校〜大学の入学・卒業の年を返す。mode="eras" は元号一覧を返し、from_year / to_year を渡すと和暦・干支・満年齢の早見表も返す(500年分まで)。日付の書き方の誤りは ok: false と error.code で返すmode?(convert / age / eras)、date?、dates?、birth?、reference?、from_year?、to_year?、lang?(既定 ja / en)
slug_generate日本語の記事タイトルから WordPress 等の URL スラッグを作る。tools.first-ch.com/slug/ と同一ロジック。かなをヘボン式ローマ字にし(し→shi・ち→chi・つ→tsu・ふ→fu・じ→ji・しゃ→sha・促音は子音を重ねて kitte/ch の前は matcha・ん は常に n・ファ→fa・ティ→ti・ヴァ→va)、記号を除いてハイフン(separator="snake" ならアンダースコア)でつなぎ小文字にする。結果は a-z・0-9・区切り文字だけ。漢字の読みは推定しない: reading にかなで読みを渡すと title の代わりにそこから作る(reading の空白が区切りになる: とうきょう で たべた ラーメン 10せん → tokyo-de-tabeta-ramen-10-sen)。読みの無い漢字は飛ばして skipped と KANJI の指摘で返す。区切りは記号・漢字・かな⇄英数字の切り替わりと、splitKatakana(既定 true)ならひらがな⇄カタカナの切り替わり。longVowel="omit"(既定)は おう・おお・うう と ー を1字にし(tokyo・ramen。えい・いい は残す)、"keep" は toukyou・raamen。助詞の は・へ・を は字のとおり ha・he・o。maxLength は語の切れ目で切る。数字だけのスラッグ(日付アーカイブと衝突し WordPress が -2 を付けうる)と60文字超を指摘する。variants に区切り×長音の4通り、items で1000件まで一括・同じスラッグの衝突を DUPLICATE で指摘title?、reading?、items?(文字列か {title, reading})、separator?(既定 kebab / snake)、longVowel?(既定 omit / keep)、maxLength?(0〜200・0=無制限)、splitKatakana?、lang?(既定 ja / en)
htpasswd_generateBasic認証用の htpasswd の行を作る。tools.first-ch.com/htpasswd/ と同一ロジック。ステージングサイトや納品前の確認環境にパスワードを掛けるための道具。ハッシュは bcrypt($2y$・Apache の htpasswd -B と同じ・既定コスト5)か apr1-md5($apr1$・Apache 2.2 など bcrypt を読めない環境向け)。1人なら user と password、まとめて作るなら users("user:pass" の文字列か {user, password})か bulk(1行1人の ユーザー名:パスワード・# で始まる行と空行は飛ばす)を渡す(200人まで)。パスワードが空のユーザーは16文字のパスワードを自動生成して generated で返す(紛らわしい字 0 O o 1 l I を除いた CSPRNG)。渡されたパスワードは結果に繰り返さない。: を含む・空・255バイト超のユーザー名は飛ばし、重複・12文字未満・ユーザー名と同じ・前後の空白・全角文字・bcrypt の72バイト超を notes で指摘する。server(apache / nginx)を渡すと .htaccess か nginx の設定スニペットも返す(file・realm・認証なしで通す ips〔IPv4 / IPv6 / CIDR〕を反映。空白を含むパスは引用し、読めないIPは外して指摘)。mode="verify"(または hash だけ)で既存の htpasswd の1行・ハッシュとパスワードを照合する($2y$ / $2b$ / $2a$・$apr1$・$1$・{SHA}。コスト15以上の bcrypt は計算しない)。outputPath を渡すとファイルへ書き出す。パスワードはどこにも記録しないuser + password、または users[] / bulk、algo?(既定 bcrypt / apr1)、cost?(4〜14・既定 5)、server?(apache / nginx)、file?、realm?、ips?、mode?(generate / verify)、hash?、outputPath?、lang?(既定 ja / en)
openapi_doc_generateOpenAPI 3.x / Swagger 2.0 の仕様書(YAML か JSON)から、日本語(lang: "en" で英語)の Markdown APIリファレンスと TypeScript の型定義を作る。tools.first-ch.com/openapi-doc-gen/ と同一ロジック。Markdown はベースURL・エンドポイント一覧・タグごとのパラメータ/リクエスト/レスポンスの表とスキーマ一覧を含み、例が書かれていないレスポンスにはスキーマから例を作る(examples: false で切る)。TypeScript は components.schemas(Swagger は definitions)を interface / type にし、operations(既定 true)でエンドポイントごとの Params / RequestBody / Response の型も出す。$ref・allOf / oneOf / anyOf・enum・nullable・additionalProperties に対応し、予約語や重複する名前は付け替えて notes で知らせる。別ファイル・URLを指す $ref は読みに行かない(unknown にして OA_EXTERNAL_REF で指摘)。YAML/JSON の解析は json_to_yaml と同じ自前パーサ(「- 」で始まる折り返し行も description の続きとして読む点だけ違う)。構文の誤りは ok: false とコード・行・桁・抜粋で返す。outputDir を渡すと <タイトル>.md と <タイトル>.ts を書き出す。20MBまでspec か path(絶対パス)、lang?(ja | en)、examples?、operations?、output?(both | markdown | typescript)、outputDir?
faq_jsonld_generate質問と回答から schema.org の FAQPage 形式の JSON-LD・同じ内容の Markdown・貼り付け用の HTML(details / summary)を同時に作る(tools.first-ch.com/faq-jsonld/ と同一ロジック)。jsonld_generate(type=faqpage)と違い、回答を「空行で段落・- / 1. で箇条書き・[文字](URL) と裸のURLはリンク」として HTML にし、「Q: / A:」や「## 見出し」でまとめて書いた文章も質問と回答に分ける。重複した質問・使えないリンク(javascript:)・相対リンクを指摘し、</script で JSON-LD が途切れないようエスケープするitems[]({q, a})と/または bulk、title?、level?(2/3)、answer_format?(html / text)、wrap_script?、exclusive?、lang?
lines_process1行1項目のテキストを整える。tools.first-ch.com/lines/ と同一ロジック。キーワード・URL・メールアドレス・商品名の一覧の重複削除や並べ替え、箇条書き化のための道具。適用順は固定で各1回: trim(前後の半角/全角空白・タブ・NBSP) → removeBlank(空行と空白だけの行) → dedupe(dedupeMode: first=最初の1行を残す / unique=重複した行は1行も残さない / dupes=重複した行だけを1行ずつ。ignoreCase で大文字小文字を区別しない) → sort(asc / desc / reverse / shuffle。asc・desc は numeric〔既定 true〕で item2 < item10・-3 < 1.25 < 10 と数を数として比べ、数値の行を文字の行より前に置く。照合は日本語の Intl.Collator) → prefix / suffix → number(start・sep: dot / paren / colon / bracket / tab / space・pad でゼロ埋め。接頭辞の外側に付く)。preset(uniqsort=トリム+空行除去+重複削除+昇順 / clean / numbered / mdlist=- の箇条書き / shuffle)は Web版のボタンと同じ設定から始め、個別の引数で上書きできる。shuffle は seed(0〜4294967295)で同じ並びを再現でき、無ければ暗号学的乱数で混ぜる。改行コードは入力の最初のものに揃え、末尾の改行も保つ。どの行が何回出たか(duplicates)と、前後の空白・大文字小文字・全角半角だけが違う組を notes で返す。text か path を渡し、outputPath でファイルへ書き出せるtext または path、outputPath?、preset?、trim?、removeBlank?、dedupe?、dedupeMode?、ignoreCase?、sort?、numeric?、seed?、prefix?、suffix?、number?、start?、sep?、pad?、lang?(既定 ja / en)
dpi_calc印刷サイズ ⇄ ピクセル数(tools.first-ch.com/dpi/ と同一ロジック)。size: 用紙(A0〜A6・B1〜B6〔JIS〕・名刺・はがき・L判・レターなど28種、または自由なmm)× dpi(既定350)× 塗り足し(既定3mm)から必要なピクセル数(端数は切り上げ)・非圧縮のデータ量・入稿メモ・指摘(dpi不足・塗り足しなし・安全な範囲・PSDの30,000px上限)。reverse: 画像のピクセル数から印刷サイズと用紙ごとの実効dpi(有利な向きを選ぶ)・判定・350dpiに必要なピクセル数。table: 早見表(テキスト/Markdown/CSV)。units: mm・cm・inch・px・pt・級(Q)の換算mode?, paper? / widthMm+heightMm, dpi?, bleedMm?, width+height(px), format?, value+from?, lang?
serp_checktitle / meta description / URL が Google 検索結果に収まるかを、文字数ではなくピクセル幅で判定する(tools.first-ch.com/serp/ の判定部分と同一ロジック・プレビュー描画は除く)。パソコン=幅600px・タイトル20px×1行・説明文14px×2行、スマートフォン=380px・2行/3行。和文は文字単位・欧文は単語単位で禁則つきで折り返し、表示される行・切り詰められる部分・幅と上限・文字数・状態(ok / cut / short / empty)・指摘(未入力・切り詰め・短い・サイト名の区切りが無い・https でない・階層が深い・%エンコード)・パンくず表示・貼り付け用タグを返す。幅は近似(Arial の字幅表+和文1em・カーニングなし)で、ブラウザの実測より数px広く出ることがあるtitle?・description?・url? か items[](500件まで)、device?(desktop / mobile / both)、lang?
css_layout_generateFlexbox / CSS Grid の指定から、コピーして使える CSS と HTML を作る(tools.first-ch.com/css-layout/ と同一ロジック)。既定値と同じ宣言は書かず、同じトラックは repeat() に畳む。grid-template-areas を検証し(行ごとのマス数・名前が長方形か・使えない名前・列トラック数との食い違い)、名前ごとの grid-area を出す。効かない組み合わせ(flex-grow と justify-content・nowrap の align-content・1fr で余白が無い)と落とし穴(min-width: auto のあふれ・1fr の最小値・reverse/dense の読む順)を notes で指摘。定番8種のプリセットmode?(flex / grid / presets), preset?, flex: direction?・wrap?・justifyContent?・alignItems? ほか、grid: columns?・rows?・areas?・autoFit?・flow? ほか、gap?, count?, items?, lang?
wiki_doc_lintNotion・Backlog Wiki・Confluence などから書き出した社内文書(Markdown / HTML / テキスト)を点検する(tools.first-ch.com/wiki-doc-lint/ と同一ロジック)。内容がほぼ同じページの組(duplicates: 記号と空白を除いた本文の4文字単位の断片の Jaccard 係数が threshold 以上の組・それぞれにしかない行・被リンクの多い方〔同数なら本文が長い方〕を残す修正案)、ほかのどのページからもリンクされていない孤立ページ(orphans: Notion 型の親ページか目次ページに足すリンクの1行 addLine つき。index・README・home などの目次ページは entryPages=false にしない限り数えない)、表記ゆれ・旧称(terms: 「揃える表記 ← ゆれ」の辞書〔dictionary は既定の辞書に足す〕と、辞書に無いカタカナ語の語末の長音ゆれ〔多い方に揃える案〕。各箇所の行番号と修正前後の文)、リンク切れ(broken: 文書の拡張子を持つ相対リンクと [[ページ名]] のうち行き先が無いもの)、修正案をまとめた Markdown の report を返す。リンクは [文字](パス)・[[ページ名]]・a タグを読み、相対パス・ページ名・Notion のIDつきファイル名・Notion/Confluence のURL末尾のページ名で照合する。コードブロック・インラインコード・URL・タグは表記ゆれの対象外で、語の途中(ユーザビリティの中のユーザ)は拾わない。paths(ファイル・フォルダーの絶対パス。サブフォルダーまで読み、隠しフォルダーと node_modules は飛ばす)か files を渡す。UTF-8・Shift_JIS・UTF-16(BOM)を自動判別し、3,000ファイル・合計60MBまで。ファイルは読むだけで書き換えないpaths? または files?([{ path, text }])、threshold?(0.5〜1・既定 0.8)、dictionary?、useDefaultDictionary?、autoChoon?、entryPages?、format?(既定 both / json / markdown)、lang?(既定 ja / en)
fit_to_box印刷済みの記入欄(市販の中袋〔ご祝儀袋・香典袋〕の「住所」「金額」「氏名」の欄など)に手で書くとき、欄の幅・高さ(mm)と向きから、収まる1字の大きさ(mm・0.1mm単位で切り捨て)・行数・改行した後の各行を返す(tools.first-ch.com/nakabukuro-ran/ と同一ロジック)。欄の線から内側へ1.5mmずつ余白を取り、行間を字の0.3倍として、行の長さと行数の両方から決める(横書きの半角英数は0.6字分・上限は住所9mm・金額と氏名14mm)。kind: "address" は「〜番地」と「建物名・部屋番号」の境目で改行し、そこで4mmに届かないときだけ都道府県・市区町村の後や番地の前でも区切る(「12番地の18」「1203号室」など数字の並びの途中では切らない・text の改行は建物名の前として扱う・最大4行)。postalCode で「〒」の行を先頭に足し、縦書きの欄では番地を漢数字にする(numerals: digits=一〇型 / tens=十型)。1字が4mm未満なら alternatives に「都道府県を省いた場合」「建物名を2行にした場合」の大きさと行を返す(省いてよいかは判断しない)。asIs は改行せずに1字5mmで書いたときにはみ出す字数。kind: "amount" は 30000・3万・30,000円 を大字の「金参萬円」にして欄に合わせる(1〜99,999,999円・圓/也/「金」「円」が印刷済みに対応)。name は空白でだけ改行し、plain は任意の文字列text、width・height(mm)、orientation?(既定 vertical / horizontal)、kind?(既定 address / name / amount / plain)、postalCode?、numerals?、thousandChar?(既定 阡 / 千 / 仟)、yenChar?(円 / 圓)、nari?、kinEnPrinted?、lang?
invoice_nebiki_checkインボイス未登録のまま取引先から値下げを求められた個人の制作者向け(tools.first-ch.com/invoice-nebiki/ と同一ロジック)。取引先の申告方式 method(general 一般課税・simplified 簡易課税・niwari 2割特例・sanwari 3割特例・exempt 免税・unknown)、party(個人・法人。特例では必須)、small(1回の請求が税込1万円未満か)の3問から、today を含む時期以降を diff(差あり・月額=税込×10/110×20/30/50/70/100% の1円未満切り捨て)・none(差なし)・check(要確認)で返す。2割特例は個人2026年分・法人は2026年9月30日を含む課税期間まで、3割特例は個人の2027・2028年分だけで、期限後は recheck: true(簡易課税へ移ったとは仮定しない)。少額特例(2029年9月30日まで)が効きうる取引は要確認。任意の monthly・cutRate/cutAmount で値下げと比べ、message は要確認の点だけを尋ねる確認文(前提4点つき・format: "md" で Markdown)。showAmount: false で金額を出さない。
reply_check届いたメール(received)と任意の「自分で決めた事実」(facts:営業時間・料金・日程など)を、AI が書いた返信案(reply)と照らし合わせる(tools.first-ch.com/okurumae/ と同一ロジック)。返信案の日付・曜日・時刻・金額・数量(〇名・〇泊・%)・電話番号・メールアドレス・URL・宛名(〇〇様・Dear Ms. …)・番号のうち、原文のどちらにも無いものを red(missing)、あるものを green(一致した箇所は hits)、[お客様1]・〇〇・XX・【】・{name} などの消し忘れを yellow で返す。日付と曜日の食い違い(例: 2026年の11月8日(金))と存在しない日付も red(weekday / nodate・実際の曜日つき)。年の無い日付は today の60日前〜305日後に入る年で確かめる。全角/半角・カンマ・「18時30分」と「18:30」・「3千円」と「3,000円」は照合のときだけそろえ、本文は書き換えない(start/end/line/column は元の返信案の位置)。count は全件、items は500件まで(truncated)。「赤が0件でも内容の正しさは保証しない」注意(note)を常に付ける。自動修正・文体の添削はしない。各欄2万字までreply、received?、facts?、today?(YYYY-MM-DD)、includeGreen?(既定 true)、lang?(既定 ja / en)
comfy_png_leak_scan受け取った・投稿した ComfyUI の PNG の埋め込みデータから APIキーの形(Google の AIza・OpenAI などの sk-・Anthropic の sk-ant-・Hugging Face の hf_・Replicate の r8_)を探す(tools.first-ch.com/comfy-key-leak/ と同一ロジック)。チャンクを順に読んで CRC を確かめ、tEXt と非圧縮の iTXt を調べる。status は found・none(安全という意味ではない)・unchecked(zTXt・圧縮 iTXt・eXIf・caBX・不明なチャンク・IEND の後ろ・30MB超)・failed(CRC 不一致・途中で切れた・PNG でない)。場所は prompt ならノードID・classType・input、workflow だけならノードIDと widgetIndex(fieldUnknown)で、JSON の重複キー・inputs の外の項目・迂回/無効のノードの印つき。ノードの表示名は使わない。値は返さない(masked=先頭4字と length だけ)。notice はキーの持ち主へのお知らせ文(値・ファイル名なし、有効性と原因は確認していないと書く)、revoke は種類ごとの公式の無効化画面。outPath で tEXt・iTXt・zTXt を抜いたコピーを、読み直して確かめてから書く(元は変えない・caBX 付きは書き換えない)。キーの有効性の確認・URL の取得はしない(ツール自体は何も送らない)。入力は path を優先する: base64 だと画像のバイト列(生のキーを含む)が AI との会話に載りモデルの提供元へ渡るため、返り値の inputNote でそれを伝えるpath(絶対パス)か base64、outPath?、overwrite?、includeUrl?、lang?
ai_vs_search自分のサイトの GA4 で、AI から来た人と検索から来た人を比べる(tools.first-ch.com/ai-vs-search/ と同一ロジック)。[トラフィック獲得](セッションのデフォルト チャネル グループ・比較とフィルタなし)から書き出した CSV を csv(文字列)か path(絶対パス)で渡す。列名は日本語・英語とも読む。Google が分類した AI Assistant・Organic Search とそれ以外の合計について、セッション・エンゲージメント率(エンゲージのあったセッション÷セッション)・セッションあたりの平均エンゲージメント時間(セッションで重み付け)・キーイベント率(キーイベント÷セッション。GA4 の「セッションのキーイベント率」とは別)を返し、ratios(AI ÷ 検索。AI が30セッション未満なら null)、totals.basis(総計行と一致 matched/除外・ずれありの read/総計行なし noTotal)、除外した行番号 excluded、notes(2026-05-13=AI Assistant チャネルの追加日より前を含む期間など)、貼り付け用の summary を返す。外部の調査値・独自の AI サービス一覧・GA4 API は使わない。完全ローカル処理・送信なし。
apps のツール(app_*・apps.first-ch.com へ送信)

既定では無効です。 入力を apps.first-ch.com へ送るため、環境変数 FIRSTCH_ENABLE_APPS=1 で明示的に有効にしたときだけ登録されます(例: claude mcp add firstch-tools -e FIRSTCH_ENABLE_APPS=1 -- npx -y @first-ch/tools-mcp)。指定しなければ、すべてのツールが端末内で動き、どこにも送信しません。

各 app_* ツールは、アプリ1本の公開 JSON API(POST https://apps.first-ch.com/<slug>/api/<action>・認証なし。一覧は llms.txt)を呼び、応答の JSON をそのまま返します。入力は apps.first-ch.com へ送られてそこで処理され、入力も結果もサーバーには保存されません。 対象サイトを取得するアプリは First CH のサーバーから相手のサイトへアクセスするので、相手側には apps.first-ch.com からのアクセスとして記録されます。全ての app_* ツールは lang?(既定 ja/en)で判定・エラー文の言語を選べます。待ち時間は30秒(重いアプリと AI のアプリは60秒)。入力の不備・相手サイトに届かない・回数制限などの API エラーは、アプリの error コードと message を含むツールのエラーとして返ります。

ツールアプリと内容主な入力
app_geoGEO簡易チェッカー — URLのページが AI検索(ChatGPT・Perplexity・Gemini・AI Overviews)に引用されやすい構造かを6軸100点で診断し、軸ごとの点数・グレード・見つかった JSON-LD の型・AIクローラーの拒否状況・改善点を返す。url
app_meta_checkメタタグ・SEO基本診断 — URLのページの title・meta description・canonical・robots・h1・OGP・lang・viewport を取得して合否つきで返す。文字数(title 全角32字・description 100〜170字)と robots.txt のクロール可否も判定する。expected(title・description・h1)を渡すと配信 HTML と照合する。url, expected
app_headersセキュリティヘッダー採点 — URLの応答の CSP・HSTS・X-Content-Type-Options・X-Frame-Options・Referrer-Policy・Permissions-Policy を100点満点で採点し、A〜Fの評価・各ヘッダーの値・解説と推奨設定例を返す。url
app_sslSSL/TLS証明書チェッカー — ホスト名へサーバー側から実際に TLS 接続し、配信中の証明書の有効期限・残り日数・発行者・SAN・中間証明書のチェーンを返す(期限30日切れで警告)。接続できないときは CT ログの記録から読む。host
app_redirect_traceリダイレクトチェーン追跡 — URLから 301・302・307・308・meta refresh の転送を1ホップずつ追跡し(最大5回)、各ステップのステータス・URL・所要時間と最終到達URLを返す。3回以上の転送には SEO 上の警告を付ける。url
app_status_checkHTTPステータス一括チェック — URLの一覧(1回10件まで)について、HTTPステータス・応答時間・リダイレクト後の最終URLをまとめて返す。リニューアル後の疎通確認やリンク集の生存確認向け。ページ本文は読まない。11件以上は10件ずつ分けて呼ぶ。urls[]
app_redirect_map301リダイレクト対応表チェッカー — サイト移転・リニューアルの「旧URL→新URL」1組について、旧URLの転送をたどり、期待した新URLへ厳密に一致して転送されているかを判定する。302の一時リダイレクト・チェーン・ループ・転送未設定・404も示す。対応表が複数組なら1組ずつ呼ぶ(同じIPから1分に60組まで。超えると HTTP 429)。from, to
app_link_checkリンク切れ・alt属性チェック — URLのページ内のリンク(a href)を抽出して最大40件の生死を確認し、404などのリンク切れ・空のリンク文字・target=_blank の危険な指定を返す。画像の alt の欠落・ファイル名のままの alt も一覧する。対象は渡した1ページだけ(サイト全体はクロールしない)。url
app_ogp_checkOGP確認(URL入力版) — URLのページの og: / twitter: タグを取得して判定し、og:image を実際に取得して寸法まで確認した結果を返す。url
app_headings見出し構造(hタグ)抽出 — URLのページの h1〜h6 を出現順に返し、h1 が複数・レベル飛ばし・空見出しを指摘する。構成案に貼れる Markdown のアウトラインも返す。url
app_structured_data構造化データ(JSON-LD)抽出・検証 — URLのページ内の JSON-LD を全て取り出して @type ごとに返し、JSON の構文エラーを行・列つきで検出する。Article・FAQPage・BreadcrumbList・LocalBusiness・Organization の必須/推奨プロパティの充足も判定する。url
app_ai_accessAIクローラー許可チェッカー — URLのサイトの robots.txt を取得し、GPTBot・ClaudeBot・PerplexityBot・Google-Extended・CCBot・Bytespider など主要AIクローラーごとの許可/拒否と効いた Disallow を返す。llms.txt の有無と X-Robots-Tag も確認する。url
app_robots_testerrobots.txt テスター — URLのサイトの robots.txt を取得し、指定した User-agent がそのURLをクロールしてよいかを Google のマッチング仕様(最長一致・同着は Allow 優先)で判定する。効いた規則と負けた規則を行番号つきで返し、構文の警告も出す。url, userAgent?
app_sitemap_checksitemap.xml 検証 — サイトマップを取得して XML 構文を検証し、URL件数・lastmod の分布・サイトマップインデックスの中身(1階層)・エスケープ漏れなどの警告(行番号つき)と、抽出したURLの先頭200件を返す。サイトのURLを渡すと robots.txt から自動発見する。gzip(.xml.gz)にも対応。url
app_hreflanghreflang 相互参照チェック — URLのページの hreflang 宣言(link rel=alternate・HTTP の Link ヘッダー)を抽出し、宣言先のページ(10件まで)も取得して返照(return link)があるかを検証する。自己参照・x-default の有無と無効な言語/地域コード(en-UK・jp 等)も判定する。url
app_mixed_content混在コンテンツチェッカー — https のページに残った http:// の参照(img・script・link・iframe・video・source・CSS の url())を抽出し、行番号・タグ・直し方と、ブラウザがブロックするか自動で https 化されるかを返す。見つかった http:// のURLへはアクセスしない。url
app_image_auditページ内画像診断 — URLのページ内の img / picture を抽出し、フォーマット(WebP・AVIF 対応)・loading=lazy・width/height の指定・alt を診断する。先頭30枚は HEAD リクエストで実際のファイルサイズと形式まで測る。url
app_gazou_ichijouhou写真の位置情報チェック — URLのページの JPEG と、WordPress の元画像の候補(-幅x高さ・-scaled を外した同じサーバーのURL)を組にして、Exif に撮影場所(GPS の緯度・経度)が残っていないかを調べる。1回で offset から5組を判定し、組の一覧(先頭20組)・画像ごとの状態と理由・次の offset を返す(next が null になるまで呼ぶ)。座標・撮影日時の値と画像のバイト列は返さない。「none」は安全の保証ではない。url, offset?
app_shashin_sozai_moto制作会社の乗り換え前に写真の利用権を確認 — URLのページの img・srcset・picture の写真を最大30枚拾い、素材サイト形式のファイル名(現在は AdobeStock_数字 のみ)と、JPEG の先頭128KBの XMP・IPTC にある撮影者・クレジット・著作権表記(各60字まで)を返す。1回で offset から10枚を判定し、写真の一覧・写真ごとの状態と理由・次の offset を返す(next が null になるまで呼ぶ)。CSS の背景画像と JavaScript で足される画像は対象外。画像のバイト列とページの原文は返さず、権利関係や違法性は判定しない。url, offset?
app_hp_sumaho_checkうちのHP、スマホで見て3つ教えて|確認依頼カード — ページの HTML と同じサイトの CSS(最大3本・解析は合計96KB/2,000規則まで)から、①本文の電話番号ごとの tel: リンク ②横ずれ(viewport の width=device-width・body や #wrapper 等の900px以上の固定幅) ③文字と拡大(user-scalable=no・maximum-scale=1・body/p の12px未満)を check/none/unknown(理由つき)で返し、記述の位置・直し方の要点と、実機で見てもらう人に聞く「はい/いいえ」の質問(最大3問)・ref 付きの共有URLを返す。合否・点数は出さず、実機の表示の判定ではない。原文は返さない。url
app_tech_detect技術スタック検出 — URLのページの HTML と応答ヘッダーのシグネチャから、CMS(WordPress・Shopify・Wix・STUDIO 等)・フレームワーク・CDN・解析タグ(GA4/GTM)・Webフォントを推定し、そう判断した根拠(どこで何に合致したか)と一緒に返す。url
app_gaibu_soushinsaki外部タグ棚卸し(解析・広告・SNS埋め込み) — URLのページを1回だけ取得し、HTMLに書かれた script の src・img・iframe の外部ホストとインラインの設置スニペットを、主要18サービス(Google・Meta・Microsoft・LinkedIn・LINEヤフー・X)の対応表と照合する。会社数・サービスごとの明細(一般的な用途・止める場所・公式資料の出典)・終了済みサービス(UA など)・表にない外部ホストと、確認用の棚卸し表(CSV)を返す。HTMLに書かれたタグだけを見るもので、実際の送信や法令への適合は判定しない(タグマネージャー経由のタグは見えない)。url
app_wp_checkWordPress簡易診断 — URLのサイトが WordPress かどうか・テーマ名・名乗っている範囲のバージョンを判定し、REST API のユーザー名列挙・xmlrpc.php・著者アーカイブ・既定のログインURL・readme.html・デバッグログの露出を診断する。攻撃的な列挙はせず GET で見える範囲だけを見る(WordPress の痕跡があるときだけ既定パス7本を追加で GET。ユーザー名は件数だけ返す)。url
app_feed_checkRSS/Atomフィード検証 — フィードを自動発見して取得し、XML の構文・必須要素・記事一覧・文字化け・日付形式(RSS は RFC 822・Atom は RFC 3339)を検証する。itunes 名前空間のあるフィードは Apple Podcasts の必須要素も確認する。url
app_favicon_checkfaviconチェッカー — URLのページの favicon.ico・link rel=icon・apple-touch-icon・Web App Manifest のアイコン宣言を抽出し、1件ずつ実際に取得して形式・実寸法(ICO は内包サイズ全部)・容量を返す。url
app_dnsDNSレコードチェッカー — ドメインの A・AAAA・CNAME・MX・TXT・NS・SOA・CAA を Cloudflare の DNS over HTTPS(1.1.1.1)で引いて返す。www の向き先・SPF が1本か・CAA の有無も判定する。domain
app_dns_propagationDNS伝播チェック — ドメインとレコード種別を5つの公開DNSリゾルバ(Cloudflare・Google・OpenDNS ほか)へ同時に問い合わせ、回答が一致しているかを返す。TTL と SOA serial から「反映待ち」と「設定ミス」を切り分けられる。expected を渡すと期待する値と一致したかも判定する。domain, type?, expected?
app_email_dnsメール設定チェッカー — ドメインの MX・SPF・DKIM・DMARC を引いて診断する。SPF は include: をたどって DNS ルックアップ10回の上限を実測し、DMARC のポリシーを解釈して Gmail 送信者ガイドライン(2024年〜)への適合も判定する。DKIM はセレクタが分からないと確認できないため、省略時は代表的なセレクタを当てる(見つからなくても DKIM が無いとは限らない)。domain, selector?
app_domain_infoドメイン情報・期限チェッカー — ドメインを RDAP(WHOIS の後継)で引き、レジストラ・作成日・有効期限と残り日数・ステータス(clientHold 等)・ネームサーバーを返す。RDAP 非対応の TLD(.jp を含む)はその旨を返す。登録者・管理者の個人情報は読まない。domain
app_domain_availabilityドメイン空き一括チェック — サービス名・屋号の候補1つについて、.com / .net / .org / .jp / .co.jp / .dev / .io / .ai / .app / .co の登録有無を RDAP と公開DNSでまとめて判定する。判定は「登録済み/未登録の可能性/判定不能」の3値で、空きは断定しない。name
app_lookalike_domain偽ドメイン見分け(取引先と照合) — 差出人のメールアドレスを取引先のドメイン(最大50件)と照合し、ローマ字の表記ゆれ・TLDの入れ替え・1文字違い・見た目の似た文字(punycode を含む)で似せた偽ドメインかを判定する。違う文字の位置と、差出人のドメインの登録日(RDAP)・MX も返す。trusted を省くと登録日と MX だけを返す。差出人のアドレスと取引先の一覧を apps.first-ch.com へ送る(保存はしない)。sender、trusted?
app_myipIP・リクエスト情報の確認 — この MCP サーバーが動いている端末から apps.first-ch.com へ届いたリクエストを見て、グローバルIP・推定国/都市・回線(ASN)・HTTP/TLS の方式・User-Agent・主要リクエストヘッダーを返す。VPN の切り替え確認などに使う。—
app_brand_fetchブランド情報抽出 — サイトのロゴ・ファビコン・主要配色・会社説明を抽出して返す。配色は CSS の出現頻度順で、白地・黒地とのコントラスト比つき。画像は URL と寸法だけを返す。提案書やモックの仮ブランド作りに使う。url
app_tone_checkビジネス文面のニュアンスチェック — 日本語のビジネスメール・提案文の失礼・曖昧・二重敬語・催促のきつさを「相手にどう受け取られるか」の観点で指摘し、言い換え候補を返す。英訳して送るときの文化的な誤解ポイントも添える。回数制限あり(同じIPから10分に5回・AIの2本合計で1日50回)。text
app_lp_persona_checkLP文言・ペルソナ反応チェッカー — LP・サービス紹介の訴求文を、選んだ業種(士業・EC・BtoB SaaS)の疑似ペルソナ3人の視点で読み、分かりやすさ・信頼性・購買意欲への影響の推定スコア、敬語トーンの強弱(5段階)、ペルソナごとの反応、言い換え案を返す。疑似ペルソナによる推測で、実在の顧客の反応ではない。回数制限あり(同じIPから10分に5回・AIの2本合計で1日50回)。text, industry
app_ja_readability_check和文可読性チェッカー — URLのページの本文の日本語タイポグラフィを、PC とスマホの画面幅で推定して診断する。1文字だけの孤立行・句読点や閉じ括弧の行頭禁則・1行の文字数(35〜40字の目安)・和文フォントのフォールバック欠けを該当箇所つきで返す。ページとその CSS(8本まで)を取得する。url, cpl?
app_faq_site_diffFAQ×サイト 記載差分チェッカー — FAQ・ヘルプページと本体サイトのページ(3件まで)の料金・営業時間・電話番号・日付・「〇日以内」などの記載を突き合わせ、食い違う箇所を返す。FAQ の更新漏れ探しに使う。faq, sites[]
app_nap_check会社名・住所・電話の表記ゆれチェッカー — 同じサイトのページ(3件まで・同じオリジン)の表示テキスト・フッター・tel: リンク・JSON-LD から会社名・住所・電話番号・営業時間を拾い、ページ間や構造化データとの表記ゆれ・不一致候補を返す。ローカルSEOの下調べに使う。同じIPから10分に10回まで(超えると HTTP 429)。urls[]
app_henji_kuruLINEの出欠の返事を貼るだけで数える|出欠集計 — LINEグループの出欠確認(○=参加・×=不参加・△=未定)への返事のうち、「私も」「前の件は欠席」など型に合わない行を1〜10行受け取り、行ごとに区分(yes / no / maybe / unclear)・人数・短い理由を返す(AI)。各行は返事と任意の直前の発言。サーバーでも電話・メール・@・「〜さん」の前の名前を伏せるが、名前は送る前に伏せておく。トーク履歴全体の集計はページの端末内の処理で、この API は行わない。AI の回数制限は共通。lines[], count?

正確な入力スキーマ(Zod定義)は、端末内のツールが server.mjs、app_* ツールが apps.mjs を参照してください。

marp_render のPDF出力にはローカルの Chrome/Chromium が必要です。 marp-core によるHTML生成はブラウザ非依存(npx 導入を軽く保つため)で、PDFはローカルインストール済みの Chrome/Chromium を headless で駆動して生成します。定番パスから自動検出し、MARP_CHROME_PATH で実行ファイルを明示することもできます。見つからない場合は HTML のみを返し pdf_skipped を報告します(そのHTMLを開いて印刷→PDF保存でも1スライド=1ページで作成できます)。

通信・ファイル・プライバシー

  • 端末内のツールと app_* ツールの違い。 app_ で始まらないツールは全て端末内で処理し、どこにも送信しません。app_* ツールだけは設計上の例外で、呼び出すたびに入力(渡した URL・ドメイン名・DKIM セレクタ・文面)を First CH のサーバー apps.first-ch.com へ送り、そこで処理した結果を受け取ります。入力も結果もサーバーには保存しません。AI のアプリ(app_tone_check・app_lp_persona_check)は文面を Cloudflare Workers AI に渡して判定し、1日の上限を数えるために日付と全体の回数だけを記録します(文面・IP は記録しません)。通常の Web アクセスと同じく、呼び出し元のグローバルIPは apps.first-ch.com(Cloudflare 上で稼働)に届きますが、IP ごとの回数制限(メモリ上のみ)に使うだけで保存しません。サイトを診断するアプリは First CH のサーバーから対象サイトを取得します。User-Agent は first-ch-tools-mcp/<version> です。機密の文面や社外秘の URL は app_* ツールに渡さず、端末の外へ出したくない入力には端末内のツールを使ってください。テスト用に FIRSTCH_APPS_BASE_URL で送り先を差し替えられます。
  • 端末内のツールは外部へ通信しません。 例外は起動時に npx が npm レジストリからパッケージを取得することと、marp_render に allowRemote: true を渡したとき(Markdown が参照する外部の画像・CSS をローカルの Chrome が読み込む)だけです。既定の marp_render は Webフォントを読まず、絵文字は文字のまま、組み込みテーマの外部 @import を取り除き、Chrome も外部通信を止めサンドボックス有効のまま起動します(サンドボックスが使えない環境だけ MARP_CHROME_NO_SANDBOX=1 で外せます)。
  • 上書きしません。 ファイルを書くツール(outputPath/outputDir を持つもの・webp_convert・marp_render)は、同名のファイルがあれば overwrite: true を渡さない限りエラーにします。これらは readOnlyHint: false・destructiveHint: true、それ以外は readOnlyHint: true を付けています。ネットワークへ出る app_* ツール(と marp_render)には openWorldHint: true を付けています。パス指定の無い marp_render は <OSの一時ディレクトリ>/firstch-tools-mcp/ に書き、書いたファイルはサーバーが消しません。
  • プライバシーポリシー: plugins/firstch-tools/PRIVACY.md。不具合・質問: GitHub Issues。

計測(Telemetry)について

既定では何も記録しません。環境変数 FIRSTCH_TOOLS_USAGE_LOG にファイルパスを設定したときのみ、各ツール呼び出しごとに1行のJSON({ ts, tool, source })をそのローカルファイルへ追記します。この記録ファイルを送信することはありません(未設定であればファイルへの書き込み自体が発生しません)。なお、これは利用記録の話で、app_* ツールは上記のとおり入力を apps.first-ch.com へ送ります。

Web版

同一アルゴリズムを、インストール不要の無料ブラウザツールとしても公開しています: tools.first-ch.com。UIで使いたいとき・MCPクライアントを持たない相手にリンクを共有したいときはこちらをどうぞ。app_* ツールは apps.first-ch.com のWebアプリと1対1で対応しています。

vendor同期(WebPコーデック)

webp_convert は @jsquash/webp v1.5.0 の無改変サブセットを vendor/jsquash-webp/ 配下に同梱しています。Web版(tools.first-ch.com)も同じv1.5.0サブセットを無改変で使っており、双方が同一の出力を返します。各リポジトリのCIが独立に、自身のvendorファイルを vendor/jsquash-webp/CHECKSUMS.sha256 に対して検証するため(.github/workflows/ci.yml 参照)、両者が気づかないうちに乖離することはありません。

ライセンス

本パッケージ自体は MIT です。

webp_convert のために jSquash のWebPコーデックの一部を vendor/jsquash-webp/ 配下に同梱しており、それぞれ別のライセンスが適用されます。

いずれのライセンスファイルも公開npmパッケージに原文のまま同梱しています(BSD-3-Clauseはバイナリ再配布時にも著作権表示・条件・免責事項の再掲を求めるため)。

開発者向け

bash
npm cinpm test        # ユニットテスト(test.mjs)と、fetch を差し替えた app_* のテスト(test-apps.mjs・実ネットワークなし)node e2e.mjs     # stdio smokeテスト: server.mjsを子プロセス起動しツール一覧取得・実行を検証(app_* は手元の偽APIへ)

test-apps.mjs は、FirstCHApps リポジトリがこのリポジトリの隣(または FIRSTCH_APPS_REPO)にあれば、apps.mjs の定義が functions/_shared/apps-registry.ts の一覧と一致するかも確かめます(無ければその検査だけ飛ばします)。

CIはNode 24 でのテストに加え、vendorチェックサム検証・公開tarball内容検査を実行します(.github/workflows/ci.yml 参照)。

来源:README.md,提交 4541c5b

工具

48

contrast_check

WCAGコントラスト比チェック

文字色と背景色のWCAG 2.1コントラスト比を計算し、AA/AAA基準(通常/大テキスト・UI部品)の合否を返す。Webデザインの配色検証・アクセシビリティチェックに使う。

输入参数bg必填fg必填

count_chars

文字数カウント(Xウェイト対応)

日本語テキストの文字数(書記素単位)・全角/半角内訳・行数と、X(Twitter)の投稿ウェイト(全角=2・半角=1・URL=一律23、上限280)を返す。SNS投稿や文字数制限のあるフォーム入力の検証に使う。

输入参数text必填

webp_convert

画像→WebP変換

PNG/JPEG画像ファイルをWebPへ変換して保存する。エンコーダは tools.first-ch.com/webp/ と同一のlibwebp WASM(品質既定80)。Web制作の画像最適化・納品前の軽量化に使う。入力は絶対パス。出力先を省略すると入力と同じ場所に拡張子.webpで保存する。

输入参数paths必填qualityoutputDiroverwrite

jsonld_generate

JSON-LD構造化データ生成

schema.org準拠のJSON-LD構造化データを生成する(tools.first-ch.com/jsonld/ と同一ロジック)。対応タイプ: organization(会社情報)/ faqpage(よくある質問)/ service(提供サービス)/ breadcrumb(パンくず)。空の項目は出力から自動で省略される。返り値は json オブジェクトと <script> スニペット。

输入参数faqtype必填servicebreadcrumborganization

llmstxt_generate

llms.txt 生成

生成AI・AI検索にサイト概要を伝える llms.txt(llmstxt.org 提案フォーマット準拠)を生成する(tools.first-ch.com/llms-txt/ と同一ロジック)。生成テキストをサイトのルート(/llms.txt)に設置して使う。

输入参数notessummarysectionssiteName必填

encoding_convert

文字コード・改行コード変換

CSV/テキストの文字コード(UTF-8 / Shift_JIS)・BOM有無・改行コード(CRLF/LF/CR)を判定し、UTF-8へ変換する。顧客から受け取ったCSVの文字化け調査、フォーム取り込みデータの前処理、リポジトリ内ファイルの改行コード事故(CRLFがLFに書き換わる等)の確認に使う。mode=analyze なら判定のみ、mode=convert なら変換後のテキストとbase64を返す。

输入参数bommodetextbase64newlineencoding

marp_render

Marp Markdown→スライド レンダリング

Marp Markdown をスライドへレンダリングし、HTML(テーマCSSをインラインした自己完結ファイル)や PDF を書き出す。AIが生成したスライド用Markdownをそのまま渡せば描画まで完結する(社内の marp ビルドの定型化・顧客配布資料の生成に使う)。和文テーマ firstch(紙/墨/朱・IBM Plex Sans JP が入っていれば使う)を同梱し、既定テーマにする。Markdown 側の Marp フロントマター(例: theme:/paginate:/size:/`<!-- _class: lead -->`)はそのまま効く。PDF はローカルの Chrome/Chromium を headless で呼び出して生成する(未検出なら HTML のみ返し理由を添える。環境変数 MARP_CHROME_PATH で実行ファイルを明示可)。既定では外部へ通信しない(Webフォントを読まず、絵文字は文字のまま、組み込みテーマの外部フォント @import は取り除き、PDF を作る Chrome も外部への通信を止めて起動する)。Markdown が参照する外部の画像・CSS を PDF に入れたいときだけ allowRemote: true を渡す。出力した HTML を利用者がブラウザで開いたときは、Markdown に書いた外部画像をそのブラウザが読み込む。ファイルを書き出す(outputPath・inputPath と同じ場所、どちらも無ければ OS の一時ディレクトリ下の firstch-tools-mcp/)。同名のファイルがあれば上書きせずエラーにする(上書きは overwrite: true)。書き出したファイルは消さない。

输入参数themetitleformatsmarkdowninputPathoverwriteoutputPathallowRemote

testdata_generate

テストデータ生成(ダミーCSV/JSON/Excel・境界値テキスト)

フォーム入力テスト・CSV取り込みテスト用のダミーデータを生成する。mode=records(既定)は氏名・フリガナ・住所・郵便番号・メール・電話番号などをCSV/TSV/JSON/XLSXで返し、文字コード(UTF-8 / Shift_JIS)・BOM・改行コード(LF/CRLF)を指定できる。format=xlsx は Excel の .xlsx ファイル(バイナリ)を base64 で返す。outputPath を併せて渡すとファイルに書き出せる。mode=text は maxlength の境界値テスト用に、指定文字種で n-1 / n / n+1 文字ちょうどの文字列を返す。生成データはすべて架空(メールは RFC 2606 の example.com 系)。seed を渡すと同じデータを再現できる。

输入参数bommoderowsseedfieldsformatheaderlengthlocalepresetnewlineencoding另有 2 个

diff_check

テキスト・コード差分チェック

2つのテキスト(またはファイル)を比較し、追加・削除・変更の件数と unified diff(.patch)を返す(tools.first-ch.com/diff/ と同一ロジック)。原稿の推敲差分の確認、コード修正のレビュー、設定ファイルの比較、AIが書き換えた文章の変更点の抽出に使う。行の対応づけは patience diff(両方に1回だけ現れる行をアンカーに分割)+アンカーの取れない範囲だけ Myers。format=blocks / both では、変更行のペアを語単位(英数字はひとかたまり・和文は1文字ずつ)で比較した changed_parts も返すため、「どの語が変わったか」まで取れる。完全ローカル処理・ネットワーク送信なし。

输入参数abpathApathBwordsformatcontextignoreCaseignoreWhitespace

cron_explain

Cron式の解説+次回発火日時

Cron式(例: */15 * * * *)を人間向けの文へ読み下し、次回からの発火日時を返す(tools.first-ch.com/cron/ と同一ロジック)。バッチ・CI・スケジューラの設定レビュー、「この式は結局いつ動くのか」の確認、書き間違いの検出に使う。解釈は Vixie cron(crontab(5))準拠で、範囲・ステップ・列挙・JAN-DEC / SUN-SAT の名前・@daily 等の省略記法に対応し、6フィールドのときは先頭を秒として扱う。「日」と「曜日」の両方が指定されたときの OR 解釈、範囲を割り切らない */n、存在しない日付(2月30日など)は warnings で知らせる。発火日時はタイムゾーンの壁時計上で求めてから実時刻へ戻すため、夏時間のある地域でもずれない。完全ローカル処理・ネットワーク送信なし。

输入参数fromcounttimeZoneexpression必填

base64_encode

Base64 / Data URI エンコード・デコード

テキストやファイルを Base64・data URI へ変換し、そのまま貼れる HTML <img> / CSS background-image のスニペットも返す(tools.first-ch.com/base64/ と同一ロジック)。mode="decode" では Base64 や data URI を元のバイト列へ戻し、outputPath を渡せばファイルとして書き出す。アイコンやSVGのCSS埋め込み、メールHTML用の画像インライン化、APIやJWTで受け取ったBase64の中身の確認、ログに出てきたdata URIの復元に使う。SVGは base64(必ず約1.33倍になる)よりパーセントエンコードの方が小さいため両方の長さを返して短い方を既定にし、& " < > # % と空白・非ASCIIを必ずエスケープするのでHTML属性にもCSSの url("…") にもそのまま貼れる。デコードは標準/URLセーフのどちらでも、空白・改行混じりでも、パディングが欠けていても読み取り、data URI が名乗るMIMEタイプより実際のマジックナンバー(PNG/JPEG/GIF/WebP/ico/PDF/zip/woff/woff2/SVG)から判定した種類を優先する。完全ローカル処理・ネットワーク送信なし。

输入参数modepathtextwrapbase64dataUriurlSafemimeTypesnippetsoverwriteoutputPath

url_params

URLパラメータの分解・編集・再構築

URLのクエリ文字列をキーと値へ分解し、編集・追加・削除・並べ替えをして再構築する(tools.first-ch.com/url/ と同一ロジック)。UTMタグの付与、gclid等のクリックIDの一括削除、文字列単体のURLエンコード/デコード(mode="encode" / "decode")もできる。リダイレクトURLやAPI引数の中身の確認、計測用URLの作成、共有前のクエリの掃除に使う。値はデコードして返し(%XX を元の文字へ、+ を半角スペースへ)、編集していないパラメータは生の文字列のまま書き戻すため、何も指定しなければ再構築後のURLは入力と1バイトも変わらない(署名付きURLを通しても壊れない)。reencode=true で全体を encodeURIComponent の規則へ正規化する。重複キー・未エンコードのスペースや非ASCII・壊れた %XX・+ のスペース解釈・UTM値の大文字混在やsource/mediumの片落ち・URL内のパスワード・トークンらしきキー・2000文字超を warnings で知らせる。相対パスや壊れたパーセントエンコードでも例外にせず、読める範囲まで分解する。完全ローカル処理・ネットワーク送信なし(URLへのアクセスは行わない)。

输入参数seturlutmmodesorttextremoveschemereencodespaceAsPlusremoveTracking

html_escape

HTML特殊文字のエスケープ・エンティティのデコード

テキスト中の < > & " ' をHTMLエンティティへ変換し、逆に &amp; &#39; &#x3042; などの文字参照を元の文字へ戻す(tools.first-ch.com/html-escape/ と同一ロジック)。記事やコード例へHTMLをそのまま載せる、テンプレートへ差し込む値を安全にする、スクレイピングやAPIで受け取ったエンティティ混じりのテキストを読める形に戻す、といった用途に使う。エスケープは & を最初に処理するため何度実行しても二重エスケープにならず、名前付き参照と数値文字参照(10進・16進)を切り替えられる。デコードはHTML 4.01の名前付き文字参照252個すべてと10進/16進に対応し、知らない名前や範囲外の数値は推測で変換せずそのまま残して notes で知らせる。&#128; のようなC1領域の数値参照はHTML仕様どおり Windows-1252 の文字(€)へ読み替える。すでにエスケープ済みの入力・裸の &・セミコロンで閉じていない参照・ノーブレークスペース(U+00A0)の混入も notes で指摘する。完全ローカル処理・ネットワーク送信なし。

输入参数aposmodepathtextquotesnumericnonAsciioverwriteoutputPath

json_to_yaml

JSON → YAML 変換・整形

JSONをYAMLへ変換して整形する(tools.first-ch.com/json-yaml/ と同一ロジック)。APIレスポンスやテンプレートの出力を docker-compose・GitHub Actions・Kubernetes マニフェストのような設定ファイルへ写すときに使う。インデント幅・引用符の付け方・null の書き方・複数行文字列をブロックスカラー(|)で書くか・キーを名前順に並べるか・先頭に --- を付けるかを選べる。別の型に読まれうる文字列(yes / no / on / off / 0755 / 12:30 / 2026-08-12 / 数値に見える文字列)、前後に空白がある文字列、- や * や # で始まる文字列は自動で引用符を付けるので、YAML 1.1 のパーサ(PyYAMLなど)に渡しても意味が変わらない。改行を含む文字列は | のブロック表記にし、行末の空白など復元できない形のときだけ "…" に倒す。コメント・末尾カンマ・シングルクォート・引用符なしのキーを含むJSON(tsconfig.json など)も読み取って変換し、JSONとしては不正であることを notes で知らせる(relaxed=false で厳密に拒否できる)。変換は完全ローカル処理・ネットワーク送信なし。text か path のどちらか一方を渡す。outputPath を渡すとファイルへ書き出す(本文は返さない)。構文エラーのときは「何行何桁・原因・直し方」と、その前後2行の抜き出しをエラーとして返すので、設定ファイルの構文チェックにも使える。読み替えで意味が変わる箇所は notes で知らせる(キーの重複=後が勝つ・2の53乗を超える整数の桁落ちなど)。

输入参数pathtextblockquoteindentrelaxeddocStartsortKeysnullStyleoverwriteoutputPath

yaml_to_json

YAML → JSON 変換・構文チェック

YAMLをJSONへ変換する(tools.first-ch.com/json-yaml/ と同一ロジック)。docker-compose・GitHub Actions・Kubernetes マニフェスト・CIの設定を、プログラムから扱える形へ読み替えるときや、構文の妥当性を確かめるときに使う。インデント2/4/タブ/1行(indent=0)を選べ、キーの並べ替えと非ASCII文字の \uXXXX 化もできる。複数ドキュメント(--- 区切り)はJSONの配列1つにまとめ、アンカー &名前 / エイリアス *名前 /マージキー << は展開する(JSONに参照の仕組みが無いため。展開したことは notes で知らせる)。スカラーの解釈は YAML 1.2 core schema に従うので yes / no / on / off / NO は文字列のままだが、YAML 1.1 のパーサでは真偽値になる値、0755(10進の755になる)、12:30(60進数の750になる)、日付に見える値は notes で知らせる。対応: ブロックマップ/シーケンス・フロー表記 [] {}・引用スカラー(複数行・エスケープ)・ブロックスカラー | > と chomping - + と明示インデント・タグ(!!str !!int !!float !!bool !!null !!binary)・コメント。未対応は「? キー」の明示キー記法のみ。変換は完全ローカル処理・ネットワーク送信なし。text か path のどちらか一方を渡す。outputPath を渡すとファイルへ書き出す(本文は返さない)。構文エラーのときは「何行何桁・原因・直し方」と、その前後2行の抜き出しをエラーとして返すので、設定ファイルの構文チェックにも使える。読み替えで意味が変わる箇所は notes で知らせる(キーの重複=後が勝つ・2の53乗を超える整数の桁落ちなど)。

输入参数pathtextasciiindentsortKeysoverwriteoutputPath

px_rem_convert

px ⇄ rem / em 単位換算・CSSの一括変換

CSSの長さの単位を px ⇄ rem / em / pt で換算する(tools.first-ch.com/px-rem/ と同一ロジック)。value を渡すと1つの値の換算になり、px・rem・em・pt の値と、そのまま貼れる font-size の1行、よく使うフォントサイズ(12〜64px)のスケール表を返す。css か path を渡すとCSS全体の一括変換になり、px→rem(px2rem)のほか px2em / rem2px / em2px を選べる。デザインカンプのpx指定をremへ直す、既存のスタイルシートをアクセシビリティのためにrem化する、rem表記のCSSを実寸で確かめる、といった用途に使う。一括変換ではコメント・文字列(content: "10px")・url() の中身と、--size-16px のように識別子の一部になっている数字は書き換えない。既定では minPx=2 で1pxの罫線を残し(remにすると環境によって太さがばらつくため)、@media などアットルールの条件(ブレークポイント)も変換しない。ルートは 62.5% のようなパーセントでも指定でき、その場合はブラウザ既定16pxに対する割合として読む。割り切れない値は丸めたことを notes で知らせる。完全ローカル処理・ネットワーク送信なし。

输入参数csspathrootunitminPxscalevalueparentdirectionoverwriteprecisionskipMedia另有 3 个

color_convert

カラーコード変換・アルファ透過計算

色のコードを HEX / RGB / HSL / OKLCH で相互変換し、アルファ(透過度)付きの rgba() / hsla() / 8桁HEX を返す(tools.first-ch.com/color/ と同一ロジック)。入力は HEX(3/4/6/8桁)・rgb()・hsl()・hwb()・oklch()・oklab()・CSSの名前付き色(148色)・transparent を受け付け、旧記法のカンマ区切りと新記法のスラッシュ区切り、角度の単位(deg / grad / rad / turn)も読む。background を渡すと、透過色をその背景の上に重ねたときに実際に見える色(アルファ合成の結果)を flattened で返すので、デザインカンプの半透明レイヤーを不透明なHEXへ置き換える用途に使える。あわせて白文字・黒文字とのWCAG 2.1コントラスト比、アルファを刻んだ表(alpha_table)、色相と彩度を保ったまま明度だけを50〜950の11段に振った明度パレット(palette)を返す。sRGBで表現できないOKLCHは、RGBを切り詰めると色相がずれるため、明度と色相を保ったまま彩度だけを下げて収める。完全ローカル処理・ネットワーク送信なし。

输入参数stepalphacolor必填syntaxpaletteuppercasealphaTablebackgroundalphaPercent

hash_generate

MD5 / SHA-1 / SHA-256 / SHA-384 / SHA-512 ハッシュ生成・照合

テキストまたはファイルの MD5・SHA-1・SHA-256・SHA-384・SHA-512 ハッシュ値を一度に算出する(tools.first-ch.com/hash/ と同一の仕様)。ダウンロードしたファイルが配布元のチェックサムと一致するかの確認、変更の検出、APIリクエストの署名計算の下ごしらえ、キャッシュキーの生成といった用途に使う。expected に期待値を渡すと桁数から対象のアルゴリズムを判定して照合し、一致したかどうかを返す。expected は `sha256sum` の出力(`<ハッシュ値>␣␣<ファイル名>`)・`SHA256 (file) = …`・`sha256:` のような接頭辞付き・コロン区切りの16進・Base64 をそのまま渡せる。出力は16進の小文字/大文字・Base64・base64url を選べる。text は改行コード(lf / crlf)とUTF-8のBOMの有無を指定できるので、Windowsで作られたファイルの値も再現できる(文字コードはUTF-8固定)。ファイルは大きくてもストリームで1パス処理する。MD5とSHA-1は衝突耐性が破られており署名・改ざん検知には使えないこと、ハッシュ値をそのままパスワード保存に使ってはいけないこと(ソルト付きのbcrypt / scrypt / Argon2を使う)は notes で知らせる。完全ローカル処理・ネットワーク送信なし。

输入参数bompathtextformatnewlineexpectedalgorithms

jwt_decode

JWTのデコード・有効期限チェック・署名の検証

JWT(JSON Web Token)をデコードしてヘッダーとペイロードを返し、有効期限(exp / nbf / iat)を判定する(tools.first-ch.com/jwt/ と同一の仕様)。開発中の認証トークンの中身の確認、「なぜ401になるのか」の切り分け、期限切れかどうかの判定に使う。token は `Authorization: Bearer <token>` のヘッダー1行のまま渡してよい(前後の引用符・改行も除去する)。key を渡すと署名も検証する: HS256/384/512 は共有鍵の文字列(keyEncoding で base64url / hex も可)、RS・PS・ES・EdDSA は SPKI形式のPEM公開鍵、またはJWK / JWKS のJSON(JWKSはヘッダーの kid で自動的に選ぶ)。秘密鍵・証明書・PKCS#1 を渡した場合は検証せず、正しい取り出し方を返す。clockTolerance で時計のズレを秒単位で許容でき、now でUNIX秒の現在時刻を固定できる(再現テスト用)。alg:none・署名なし・期限切れ・nbfが未来・expがミリ秒(Date.now()の入れ間違い)・有効期間が長すぎる・ペイロードに秘密情報や個人情報が入っている、といった落とし穴は warnings で知らせる。5セグメントのJWE(暗号化トークン)はヘッダーのみ返す(復号は行わない)。完全ローカル処理・ネットワーク送信なし(JWKSの取得も行わないので、鍵は呼び出し側が渡す)。

输入参数keynowtoken必填keyEncodingclockTolerance

user_agent_parse

User-Agent文字列の解析とデバイス判定

User-Agent文字列から、ブラウザ名とバージョン・レンダリングエンジン・OSとそのバージョン・デバイス種別(desktop / mobile / tablet / tv / console / wearable / bot)・メーカーと機種・CPUアーキテクチャを判定する(tools.first-ch.com/user-agent/ と同一の仕様)。アクセスログの調査、問い合わせに付いてきたUAの読み解き、対応ブラウザの棚卸しに使う。ua はアクセスログの行のまま渡してよい(先頭の `User-Agent:`・前後の引用符・末尾のカンマは除去する)。uas に配列を渡すと複数件をまとめて解析し、ブラウザ・OS・デバイス種別の内訳を summary で返す。判定は「より限定的なトークンから先に試す」順序で行う(Edg/ → OPR/ → Chrome/ → Safari/)。Chrome・Edge・Opera はいずれも `Safari/` と `Chrome/` を名乗るため、部分一致では取り違える。tokens でUA文字列をトークン単位に分解し、`Mozilla/5.0` や `KHTML, like Gecko` のような化石の意味を返す。notes では「UAでは分からないこと」を知らせる: Chrome 110以降の削減済みUA(マイナー版は 0.0.0、Androidの機種名は `K` に凍結)、macOSが常に 10.15.7 を名乗ること、Windows 10と11が区別できないこと、iPadがMac版Safariと同じUAを送ること、アプリ内ブラウザ(LINE / Instagram / Facebook / Android WebView)、そしてUAは誰でも名乗れるためアクセス制御の根拠にできないこと。Googlebot・GPTBot・ClaudeBot などのクローラーや curl・python-requests のHTTPクライアントも判定する。完全ローカル処理・ネットワーク送信なし。

输入参数uauasincludeTokens

uuid_generate

UUID v4 / ULID の一括生成

UUID v4 または ULID を1〜100件まとめて生成する(tools.first-ch.com/uuid/ と同一の仕様)。テストデータやマイグレーションの一意なIDの発行、DBのダミーレコード作成に使う。UUID v4 は128bitのうち122bitが乱数(残る6bitがバージョン4とバリアント)で、順序を持たない。ULID は26文字で、先頭10文字が生成時刻(UNIX時間のミリ秒・48bit)、後ろ16文字が乱数(80bit)。時刻が先頭にあるため文字列の辞書順が生成順と一致し、IDから作成日時を読み戻せる(DBの主キーにするとB+treeインデックスの断片化を避けやすい。ただし生成時刻は誰にでも読める)。同一ミリ秒内に複数生成するときは ULID 仕様の単調増加(monotonic)に従って乱数部を+1するため、100件を一度に作っても順序が崩れない。乱数は node:crypto の randomBytes(CSPRNG)で、Math.random は使わない。format で出力の形(1行1件 / JSON配列 / カンマ区切り / SQLのINSERT向けの引用符付き)を、uppercase・hyphens・braces で表記(UUIDの既定は RFC 9562 に従い小文字・ULIDの既定は大文字)を選べる。完全ローカル処理・ネットワーク送信なし。

输入参数typecountbracesformathyphenstimestampuppercase

aspect_ratio_calc

アスペクト比の計算・レスポンシブサイズ算出

アスペクト比と寸法を相互に計算する(tools.first-ch.com/aspect-ratio/ と同一ロジック)。ratio('16:9' / '16/9' / '1.85')と width か height の片方を渡すと、もう一方の寸法を返す。width と height を渡して ratio を省くと、最大公約数で約分した比率・小数・向き・画素数と、いちばん近い定番比率(16:9・4:3・3:2・1:1・4:5・9:16・21:9・1.85:1・2.39:1・1.91:1(OGP)・黄金比など)からのずれを返す。1920×1080 のように名前のある寸法はその名前も返す。round で 四捨五入(round)・偶数(even)・切り捨て(floor)・切り上げ(ceil)を選べ、丸めた場合は丸め後の実際の比率と指定した比率からのずれ(%)を返す。H.264 / H.265 は色情報を縦横半分で持つ(YUV 4:2:0)ため幅・高さとも偶数が必要で、動画向けには round="even" を使う。box を渡すと、その枠へ contain / cover ではめ込んだときの描画サイズ・拡大率・余白(レターボックス / ピラーボックス)・切り取られる量・見える割合を返す。widths か table=true でブレークポイントごとの高さの早見表を、snippet=true で aspect-ratio のCSSと(CLSを防ぐ width / height 属性入りの)HTMLを返す。完全ローカル処理・ネットワーク送信なし。

输入参数boxfitratioroundtablewidthheighttargetwidthssnippetfallbackselector另有 1 个

markdown_table

TSV/CSV → Markdownテーブル整形・相互変換

ExcelやスプレッドシートからコピーしたTSV/CSV(クリップボードの中身はカンマ区切りではなくタブ区切り)をMarkdownの表へ整形し、逆にMarkdownの表をCSV/TSV/HTML/JSONへ書き出す(tools.first-ch.com/markdown-table/ と同一ロジック)。区切り文字はタブ・カンマ・セミコロンのそれぞれで実際に読んでみて「列数がいちばん揃うもの」を選ぶ方式で自動判定するため、金額の桁区切り(1,200)が入っていても列がずれない。CSVはRFC 4180の引用符(セル内のカンマ・改行・"" )に対応。桁揃えでは全角文字をUnicodeのEast Asian Width(Wide / Fullwidth)に従って2桁として数えるので、等幅フォントで縦線が揃う。空でないセルがすべて数値(桁区切り・小数点・通貨記号・%・単位を含む)の列は自動で右寄せ(---:)にし、aligns で列ごとに指定もできる。セルの中の | は \| へエスケープし、セル内の改行は <br> か半角スペースへ置換し、列数が足りない行には空セルを補う(直した件数は notes で返す)。Markdownを読むときは区切り行のコロンから配置を読み取り、<br> は改行へ戻すので、CSVへ書き出せばセル内改行のあるデータとして表計算ソフトへ戻せる。text か path のどちらか一方を渡す。outputPath を渡すとファイルへ書き出す(本文は返さない)。完全ローカル処理・ネットワーク送信なし。

输入参数toeolpadfrompathtexttrimalignalignsheadereastAsianmultiline另有 5 个

sql_format

SQLクエリの整形(予約語の大文字化・句ごとの改行・字下げ)

ログやORMが吐いた1行に固まったSQLを、予約語の大文字化・句ごとの改行・字下げの付いたクエリへ整形する(tools.first-ch.com/sql-format/ と同一ロジック)。SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY / LIMIT / INSERT INTO / VALUES / UPDATE / SET / DELETE FROM / WITH / UNION などの句を行頭へ、その中身を1段下げて並べ直す。JOIN は行頭に置いて ON を1段下げ、AND / OR は条件ごとに改行する(BETWEEN a AND b の AND は条件の区切りではないので改行しない)。( の直後が SELECT / WITH / VALUES のときだけサブクエリとみなして改行+字下げし、関数呼び出し(SUM(…) / IN (1, 2, 3) / OVER (PARTITION BY … ORDER BY …))は1行のまま保つ。CASE 式は WHEN / ELSE / END を縦に並べる。予約語と型名だけを大文字(または小文字)へ揃え、テーブル名・列名・別名の綴りは変えない(識別子の折りたたみ方がDBごとに違うため)。文字列('…')・引用符付き識別子("…" / `…` / […])・コメント(-- / # / /* … */)・プレースホルダ(? / :name / $1 / @var)はそのまま残す。整形と同時に、WHEREの無いUPDATE/DELETE・閉じていない括弧や引用符・SELECT *・暗黙の結合・プレースホルダの有無を notes で返す。compact=true にすると逆に改行を畳んで1行へ戻す。特定DBのパーサーではなく字句ベースの整形器なので、MySQL・PostgreSQL・SQL Server・SQLite・Oracle の方言も壊さずに通す(構文エラーの検出はしない)。text か path のどちらか一方を渡す。outputPath を渡すとファイルへ書き出す(本文は返さない)。完全ローカル処理・ネットワーク送信なし。

输入参数eolpathtextindentbreakOncompactbreakCaseoverwritebreakLogiccommaStylelogicStyleoutputPath另有 5 个

qr_generate

QRコードの生成(SVG / PNG / 文字の図)

URLやテキストからQRコードを生成し、SVG(ベクター)・PNG・端末に貼れる文字の図で返す(tools.first-ch.com/qr/ と同一ロジック)。符号化(数字 / 英数字 / UTF-8のバイトモードを入力に応じて自動選択)・リード・ソロモン符号による誤り訂正・位置検出パターンや型番情報の配置・8種類のマスクからの自動選択まで自前で実装しており(JIS X 0510 / ISO 18004・型番1〜40)、外部のAPIも画像生成サーバーも使わない。誤り訂正レベルは L(約7%)/ M(約15%)/ Q(約25%)/ H(約30%)から選ぶ(印刷物はQ以上を推奨)。size は出力の一辺(px。SVGでは表示上の初期サイズ)、margin は余白=クワイエットゾーンのモジュール数で規格の推奨は4(0にすると背景によっては読み取れなくなる)。Wi-Fi(WIFI:T:WPA;S:…;P:…;;)・メール(mailto:)・電話(tel:)・SMS(SMSTO:)・座標(geo:)などの定型書式も、その文字列をそのまま text に渡せばよい。outputPath を渡すとファイルへ書き出す(本文は返さない)。format="png" で outputPath を省いた場合は data URI で返る。容量の上限は数字7089桁・英数字4296文字・バイト2953文字(いずれもレベルL)で、超えるとエラーになる。完全ローカル処理・ネットワーク送信なし。

输入参数maskmodesizetext必填formatmarginecLeveloverwriteminVersionoutputPath

unixtime_convert

UNIXタイムスタンプ⇄日時の相互変換

UNIX秒・ミリ秒・マイクロ秒・ナノ秒と、ISO 8601や日時文字列を相互に変換する(tools.first-ch.com/unixtime/ と同一ロジック)。ログに出ている数値が結局いつなのかの確認、期限や有効期限の突き合わせ、タイムゾーンをまたぐ時刻のすり合わせに使う。数値の単位は桁数から自動判定する(10桁までを秒 / 13桁までをミリ秒 / 16桁までをマイクロ秒 / それ以上をナノ秒)。unit を渡せば自動判定を使わずその単位で読む。ミリ秒より下の桁は切り捨て、その旨を notes で返す。日時側は 2026-08-24T09:30:00Z(ISO 8601)・2026-08-24 18:30・2026/8/24 9:05・2026年8月24日 18時30分・Sun, 24 Aug 2026 03:00:00 GMT(HTTP-date)・now を受け付け、CSVやJSONから貼ったときの引用符・角括弧・行末カンマは自動で外す。input は1行1件で最大500行まとめて変換でき、行ごとにUNIX秒・ミリ秒・ISO 8601(UTC)・指定タイムゾーンの現地時刻(曜日・UTCオフセット付き)・相対表示(○分前 / ○日後)を返す。読めなかった行は他の行を巻き込まず、その行だけ error として返す。**オフセットを持たない日時は timeZone の壁時計として解釈**し、必ず notes で明示する(+09:00 や Z が入力にあれば timeZone より入力側が優先される)。夏時間で存在しない時刻は切り替え後へ繰り上げ、こちらも notes に出す。8桁の数字(20260824)はUNIX秒として読むため、日付のつもりの入力には notes で注意を返す。負の値(1970年より前)と小数点付きの秒にも対応する。完全ローカル処理・ネットワーク送信なし。

输入参数nowlangunitinput必填timeZone

robotstxt_generate

robots.txt の生成(AIクローラー対応)

クロールの許可/禁止ルール・サイトマップ宣言・AIクローラーの許可プリセットから robots.txt を組み立てる(tools.first-ch.com/robots-txt/ と同一ロジック)。サイト公開前の robots.txt の作成、「AIの学習には使わせたくないが、AI検索の結果には出したい」といった書き分けに使う。ai.preset で24種のAIクローラー(GPTBot / OAI-SearchBot / ClaudeBot / Claude-SearchBot / Google-Extended / PerplexityBot / Bytespider / CCBot など)の扱いをまとめて決められる: 'training'(既定=学習目的だけ拒否しAI検索と都度取得は許可) / 'allow'(全部許可) / 'block'(全部拒否) / 'none'(AIクローラーを書かない) / 'custom'(ai.overrides で1件ずつ指定)。**クローラーは自分に一致するグループを1つだけ読む**ため、AI用のグループを作ると User-agent: * の禁止ルールがそのクローラーへ届かなくなる。既定では共通の禁止パスをAI側のグループへ書き写して取りこぼしを防ぐ(ai.inherit=false で止められる)。パスは先頭の / の補完と絶対URLからのパス抽出を自動で行い、空白を含むパス・パーセントエンコードしていない日本語のパス・ワイルドカード非対応クローラー・Googlebotが読まない Crawl-delay・サイトマップの宣言漏れ・同じUser-agentの重複・サイト全体の拒否などを warnings で返す。listCrawlers=true を渡すと生成せずAIクローラーの一覧(名前・提供元・目的)だけを返す。outputPath を渡すとそのパスへ書き出す。完全ローカル処理・ネットワーク送信なし。

输入参数ailangallowgroupssiteUrlcommentsdisallowsitemapsoverwriteallowStylecrawlDelayoutputPath另有 3 个

case_convert

文字列のケース変換(camelCase / snake_case / kebab-case)

識別子を camelCase / PascalCase / snake_case / CONSTANT_CASE / kebab-case と、Train-Case・dot.case・Title Case・Sentence case・lower case・UPPER CASE を合わせた11形式へ相互変換する(tools.first-ch.com/case/ と同一ロジック)。変数名の一括リネーム、DBの列名とAPIのJSONキーの読み替え、CSVヘッダーの整形といった定型処理に使う。scope で処理の単位を選ぶ: lines(既定=1行1件) / items(行内のカンマ・タブ区切りで1件ずつ=CSVヘッダー) / whole(全体で1件)。**前後の空白・インデント・改行コード(LF/CRLF)・区切り記号はそのまま残す**ので、表の列やコードの並びを崩さずに名前だけ置き換わる。語の分かち書きは、大文字の連なりの直後に「大文字+小文字」が続くときだけ手前で切る(XMLHttpRequest → XML / Http / Request)。数字は既定で直前の語に付ける(sha256Hash → sha256 / Hash。splitDigits=true で sha / 256 / Hash)。頭字語は既定で畳んで parseXmlData にし、keepAcronyms=true なら parseXMLData のまま残す(camelCase の先頭語はどちらでも小文字=URLParser → urlParser)。大文字小文字を持たない文字(日本語など)はそのまま出力し、ローマ字化はしない。**変換後に同じ名前へ衝突する項目**(first name と first_name はどちらも first_name)・数字で始まって識別子にできない結果・頭字語を含む項目・入力の形式の推定を notes と stats で返す。allFormats=true で各項目を全形式へ展開、listFormats=true で変換せず形式の一覧と使いどころだけを返す。outputPath を渡すとそのパスへ書き出す。完全ローカル処理・ネットワーク送信なし。

输入参数langpathtextscopeformatoverwriteallFormatsoutputPathlistFormatssplitDigitskeepAcronyms

csv_convert

CSV/TSV ⇄ JSON の相互変換

CSV/TSVとJSON配列を相互変換する(tools.first-ch.com/csv-json/ と同一ロジック)。表計算ソフトから書き出した表をAPIに渡せるJSONにする、逆にAPIの応答をExcelで開ける表にする、といった用途に使う。direction を省くと入力の先頭が [ か { なら json2csv、そうでなければ csv2json と推定する。区切り文字は先頭20行で「どの記号が各行に同じ個数だけ現れるか」を見て自動判定し、delimiter で固定もできる。**stock.qty のような列名は入れ子のオブジェクトとして読み書きし、tags.0 / tags.1(tags[0] も同義)は配列になる**。逆向きも同じ規則で平らにするので、CSVへ出してJSONへ戻すと元の構造に復元される(nest=false なら入れ子はJSONの文字列としてセル1つに入る)。**型の読み替えは「一度数値にして文字列へ戻したとき元の表記と1文字も違わないか」で決める**ため、0123・+1・1.50・2の53乗を超えるID(12345678901234567890)は文字列のまま残り、郵便番号・電話番号・伝票番号・バージョン番号が壊れない。読み取りは RFC 4180 準拠で、引用符・"" エスケープ・セル内改行・CRLF・BOM に対応する(書き出し側は bom / newline を選べる)。JSONは配列・単体のオブジェクト・{"data":[…]} のように配列を包んだもの・1行1件のJSON Lines を受け取れる。**JSONの構文エラーは行・桁と前後の抜粋を返す**(例外にせず ok:false の結果として返すので、そのまま直しどころになる)。あわせて、列数が見出しと合わない行・重複した列名(name_2 として残す)・空の見出し(column4 を割り当てる)・桁落ちする数値・= + - @ で始まり表計算ソフトが数式として実行しうるセル(CSVインジェクション)・キーの並びが揃わないオブジェクトを notes で指摘する。outputPath を渡すとそのパスへ書き出す(本文は返さない)。完全ローカル処理・ネットワーク送信なし。

输入参数bomlangnestpathtexttrimtypesheaderindentnewlinequoteAlldelimiter另有 4 个

zenkaku_convert

全角⇄半角の変換とテキストの掃除

英数字・カタカナ・記号・スペースを**文字種ごとに**全角⇄半角へ変換し、あわせて空白まわりを掃除する(tools.first-ch.com/zenkaku/ と同一ロジック)。顧客支給原稿の表記統一、CSV取り込み前の正規化、フォーム入力値の掃除に使う。alnum / kana / symbol / space をそれぞれ keep(そのまま)/ han(半角へ)/ zen(全角へ)で指定する。既定は日本語の原稿で最も多い「英数字・記号・スペースは半角、カタカナは全角」(preset="ja" と同じ)。preset は ja / csv(jaに空白の掃除と見えない文字の除去を足したもの)/ han(すべて半角)/ zen(すべて全角)で、個別指定が優先される。**半角カタカナは1文字ではない**ため、半角→全角では次が濁点なら1文字へ合成し(ガ→ガ・パ→パ・ヴ→ヴ)、全角→半角では2文字へ分解する。句読点・カギ括弧・中黒・長音(。 、 「 」 ・ ー)は半角カタカナのブロック(U+FF61〜U+FF9F)に同居しているので**カタカナと同じ文字種**として扱う(kana="han" は「テスト」。を 「テスト」。 にする。句読点を全角で残したいなら kana="keep")。スペースは全角スペース(U+3000)⇄半角スペースで、NBSP(U+00A0)や欧文の各種スペースも半角側へ寄せる。掃除は collapseSpaces(連続する空白を先頭の1文字へ)/ trimLines(行頭行末の空白)/ blankLines(keep・collapse・remove)/ removeInvisible(ゼロ幅・BOM・制御文字)/ composeMarks(結合した濁点をNFCで合成)。**改行コード(LF/CRLF)とタブ、ひらがな・漢字は書き換えない**。出力に残った半角カナ・全角スペース・見えない文字・結合文字の濁点と、波ダッシュ〜(U+301C)/全角チルダ~(U+FF5E)・環境依存文字(① ㈱ Ⅲ)を notes で指摘する(後の2つはどちらへ寄せるべきかが届け先で変わるため、指摘のみで自動変換しない)。**NFKC正規化とは別物**で、①→1 や ㈱→(株) のような潰し方はせず、選んだ文字種しか触らない。inspect=true なら変換せず、半角カナ・全角スペース・見えない文字が入っていないかの点検だけを返す。outputPath を渡すとそのパスへ書き出す。完全ローカル処理・ネットワーク送信なし。

输入参数kanalangpathtextalnumspacepresetsymbolinspectoverwritetrimLinesblankLines另有 4 个

cidr_calc

IPアドレス・CIDRの計算

CIDR表記・サブネットマスク・ワイルドカードマスク・単体のIPから、ネットワークアドレス・ブロードキャスト・使えるホストの範囲・アドレス数・逆引きゾーン・2進表記までを計算する(tools.first-ch.com/cidr/ と同一ロジック)。サーバー設定・ファイアウォール・許可リストの作成時のサブネット計算に使う。**IPv4とIPv6の両対応**(IPv6は `::` の省略・末尾のIPv4表記・`[...]`・`%zone` を読み、出力は RFC 5952 に従う)。`192.168.1.5 255.255.255.0`(マスク併記)や `192.168.1.5/0.0.0.255`(ACLのワイルドカード)も同じ入力欄で受け取る。**ホスト数の例外も織り込む**: `/31` は点対点リンクとして2アドレスとも使え(RFC 3021)、`/32` は1台、IPv6にブロードキャストは無い。入力がネットワークアドレスでない(ホスト部にビットが立っている)ときは、設定に書くべき本来のCIDRを notes で返す。**先頭に0の付いたオクテット(192.168.001.1)は受け取らない**(8進数として読む実装があり、同じ表記が別のアドレスになるため)。アドレス帯は IANA の Special-Purpose Address Registry の主要ブロック(プライベート・CGNAT・ループバック・リンクローカル・文書用・マルチキャスト・ULA ほか)と照合して種別を返し、ネットワークがその帯からはみ出す場合も指摘する。`split` を渡すとそのプレフィックス長で均等に分割した一覧を、`contains` を渡すと各アドレスがそのネットワークに入るかを返す。`range` に「10.0.0.5 - 10.0.0.200」のような範囲・CIDR・単体IPを(`;` か改行で区切って)渡すと、**重なりと隣接をまとめたうえで過不足なく覆う最小個数のCIDR集合**へ逆算する。計算はすべてBigIntで行い、完全ローカル処理・ネットワーク送信なし。

输入参数cidrlanglimitrangesplitcontains

date_calc

日数・営業日の計算

2つの日付の間の日数・営業日数、起点日から N日後/N営業日後の期日、締め日と支払サイトからの支払日を計算する(tools.first-ch.com/date-calc/ と同一ロジック)。納期・検収期限・支払サイトの確認に使う。**営業日は「土日・日本の祝日・指定した休業日を除いた日」**で、祝日は内閣府「国民の祝日について」の一覧を同梱しており(1970年〜2027年)、ハッピーマンデーで動く祝日・日曜と重なったときの振替休日・前後を祝日に挟まれた国民の休日(2026-09-22 など)・年で変わる春分の日/秋分の日がすべて入る。`mode="between"` は start と end の間の暦日数・営業日数・休みの内訳・期間内の祝日一覧を返す。`mode="add"` は base から n(負なら過去へ)を unit の単位で進めた期日を返し、飛ばした休みも一覧で返す。**「受領後10営業日」は初日を数えるかで1日ずれる**ため、民法の原則どおり翌日起算を既定とし、`include_start=true` で起点日を1日目として数える。`mode="payment"` は invoice・closing(締め日)・pay_months・pay_day から支払日を求め、休みに当たったら `pay_adjust`(既定 prev=前営業日へ繰り上げ・日本の商慣習)で寄せる。週の休み(weekend)・年末年始(year_end)・自社の休業日(closed_dates)・休日出勤(work_dates)を指定できる。日付は「1970-01-01からの通算日」の整数で扱うのでサーバーのタイムゾーンで1日ずれない。完全ローカル処理・ネットワーク送信なし。

输入参数nendbaselangmodeunitstartadjustclosinginvoicepay_dayweekend另有 7 个

html_to_markdown

HTML → Markdown 変換

HTML断片をMarkdownへ変換する(tools.first-ch.com/html-md/ と同一ロジック)。取得したページの本文をMarkdownに直して渡す前処理、既存サイトの原稿をMarkdown管理へ移す移行作業に使う。見出し(h1〜h6)・段落・改行・強調・取り消し線・リスト(入れ子・start 属性・チェックボックス)・表(thead / caption と align / text-align による列の配置)・リンク・画像・コードブロック(class="language-*" から言語を拾う)・引用・水平線・定義リスト・figure / figcaption・details / summary に対応し、script・style・hidden や display:none の要素・装飾のための div / span は自動で取り除く。**HTMLの解釈にブラウザのDOMを使っていない**——字句解析も木の組み立ても自前なので、Web版と結果が一致し、閉じ忘れたタグは末尾で閉じ、行き場のない閉じタグは捨てて変換を続ける(**属性の引用符が閉じていない場合だけは打ち切る**。続けると残りの文書全体を1つの属性値として飲み込むため)。補った内容・落とした内容はすべて notes で返す。**Markdownに書けないものは黙って捨てない**: セルの結合(colspan は空セルで埋め、rowspan は先頭行にだけ値が入る)・セル内のリスト/コードブロック(その表だけHTMLのまま残す)・定義リスト(Markdown Extra の ": " 記法)・sup / sub / mark / iframe / svg(unknown で「HTMLのまま残す/文字だけ残す/取り除く」を選ぶ)。表・タスクリスト・取り消し線はGFMの拡張でCommonMarkには無いため gfm=false で切れる。**相対URLは貼り先で必ず壊れる**ので、base_url を渡すとリンクと画像を絶対URLへ直す(アンカーと絶対URLはそのまま)。main_only=true は main / article の中だけを取り出して header・nav・footer・aside・form を落とす。html か path のどちらか一方を渡す。outputPath を渡すとファイルへ書き出す(本文は返さない)。ネットワークへは出ないので、ページの取得は呼び出し側で行うこと。完全ローカル処理・ネットワーク送信なし。

输入参数brgfmhtmllangpathlinksbulletescapeimagestablesunknownbase_url另有 6 个

wareki_convert

和暦 ⇄ 西暦変換・満年齢

和暦(令和・平成・昭和・大正・明治)と西暦を相互に変換し、曜日と干支を返す(tools.first-ch.com/wareki/ と同一ロジック)。契約書・請求書・行政書類の日付表記の変換と検算に使う。`mode="convert"` は date(1件)か dates(配列・1000件まで)を受け、**西暦か和暦かを自動で見分ける**: 2026-10-01 / 2026/10/1 / 20261001 / 2026年10月1日 / 令和8年10月1日 / R8.10.1 / 令和八年十月一日 / ㋿8.10.1 / Reiwa 8 など。年だけ(1989・昭和64年)・年月だけ(2019-05)も変換でき、改元をまたぐときは両方の元号を返す。書き方は和暦(元年表記・曜日つき・漢数字)・略記(R8.10.1 / R08.10.01)・西暦・ISO 8601・英語を formats で返す。改元日は大正1912-07-30・昭和1926-12-25・平成1989-01-08・令和2019-05-01。**存在しない和暦(平成32年・平成31年5月1日・令和元年4月30日)も西暦へ直したうえで正しい和暦を notes で指摘**し、書き添えの曜日((金)など)が実際と違えば WEEKDAY_MISMATCH を返す。**明治5年(1872年)以前は旧暦のため年単位でだけ換算する**(LUNAR_CALENDAR)。`mode="age"` は birth(和暦可)と reference(省略時は日本時間の今日)から満年齢(誕生日に1つ増える・2月29日生まれは平年だと3月1日)・年月日の内訳・数え年・次の誕生日と、小学校〜大学の入学・卒業の年(4月2日〜翌4月1日生まれが同学年・浪人なし)を返す。`mode="eras"` は元号一覧を返し、from_year / to_year を渡すと和暦・干支・満年齢の早見表も返す(500年分まで)。日付の書き方の誤りは ok:false と error.code で返す。日付は通算日の整数で扱うのでサーバーのタイムゾーンで1日ずれない。完全ローカル処理・ネットワーク送信なし。

输入参数datelangmodebirthdatesto_yearfrom_yearreference

slug_generate

URLスラッグ生成(日本語タイトル→ローマ字)

日本語の記事タイトルから WordPress 等の URL スラッグを作る(tools.first-ch.com/slug/ と同一ロジック)。かなをヘボン式ローマ字にし(し→shi・ち→chi・つ→tsu・ふ→fu・じ→ji・しゃ→sha・促音は子音を重ねて kitte/ch の前は matcha・ん は常に n・ファ→fa・ティ→ti・ヴァ→va)、記号を除いてハイフン(separator="snake" ならアンダースコア)でつなぎ、小文字にする。結果は a-z・0-9・区切り文字だけ。**漢字の読みは推定しない**: reading にかなで読みを渡すと、title の代わりに reading から作る(読みは呼び出し側=AIが決める)。reading の空白は区切りになるので語の切れ目で空ける("とうきょう で たべた ラーメン 10せん" → tokyo-de-tabeta-ramen-10-sen)。reading なしで漢字が残ると漢字を飛ばして作り、飛ばした字を skipped と notes(KANJI) で返す。区切りは空白・記号・漢字・かな⇄英数字の切り替わり(splitKatakana=true〔既定〕ならひらがな⇄カタカナの切り替わりも)。longVowel="omit"(既定)は「おう・おお・うう」と長音記号ーを1字にする(とうきょう→tokyo・ラーメン→ramen。えい・いい は残す)、"keep" は toukyou・raamen。助詞の は・へ・を は字のとおり ha・he・o。半角カナ・全角英数字はそろえ、アクセント記号は外す(Café→cafe)。maxLength で上限(語の切れ目で切る)。数字だけのスラッグ(日付アーカイブと衝突し WordPress が -2 を付けうる)と60文字超を notes で指摘。区切り×長音の4通りを variants で返す。items で1000件までまとめて作れ、同じスラッグになる項目を DUPLICATE で指摘する。完全ローカル処理・ネットワーク送信なし。

输入参数langitemstitlereadinglongVowelmaxLengthseparatorsplitKatakana

htpasswd_generate

htpasswd 生成・照合(Basic認証)

Basic認証用の htpasswd の行を作る(tools.first-ch.com/htpasswd/ と同一ロジック)。ステージングサイト・納品前の確認環境に Basic 認証を掛けるときに使う。ハッシュは bcrypt($2y$・Apache の htpasswd -B と同じ・既定コスト5)か apr1-md5($apr1$・Apache 2.2 など bcrypt を読めない環境向け)。1人なら user と password、まとめて作るなら users(文字列 "user:pass" か {user, password})か bulk(1行1人の「ユーザー名:パスワード」・# で始まる行と空行は飛ばす)を渡す(200人まで)。**パスワードが空のユーザーは16文字のパスワードを自動生成し、generated で返す**(紛らわしい字 0 O o 1 l I を除いた CSPRNG)。利用者が渡したパスワードは結果に繰り返さない。「:」を含む・空・255バイト超のユーザー名は飛ばし、重複・12文字未満・ユーザー名と同じ・前後の空白・全角文字・bcrypt の72バイト超(以降は無視される)を notes で指摘する。server(apache / nginx)を渡すと .htaccess か nginx の設定スニペットも返す(file・realm・認証なしで通す ips〔IPv4 / IPv6 / CIDR〕を反映。空白を含むパスは引用し、読めないIPは外して指摘)。mode="verify" か hash を渡すと、既存の htpasswd の1行(またはハッシュ)と password を照合する($2y$/$2b$/$2a$・$apr1$・$1$・{SHA}。コスト15以上の bcrypt は照合しない)。outputPath を渡すと htpasswd の中身をファイルへ書き出す(本文は返さない)。パスワードはどこにも記録しない。完全ローカル処理・ネットワーク送信なし。

输入参数ipsalgobulkcostfilehashlangmodeuserrealmusersserver另有 3 个

openapi_doc_generate

OpenAPI → 日本語ドキュメント&TypeScript型定義

OpenAPI 3.x / Swagger 2.0 の仕様書(YAML か JSON)から、日本語(lang="en" で英語)の Markdown APIリファレンスと TypeScript の型定義を作る(tools.first-ch.com/openapi-doc-gen/ と同一ロジック)。受け取った仕様書を顧客・チーム向けの読める資料にする、フロントエンドの型を手書きせずに起こす、といった用途に使う。Markdown はベースURL・エンドポイント一覧・タグごとのパラメータ/リクエスト/レスポンスの表・スキーマ一覧を含み、例が書かれていないレスポンスにはスキーマから例を作る(examples=false で切る)。TypeScript は components.schemas(Swagger は definitions)を interface / type にし、operations=true(既定)ならエンドポイントごとの Params / RequestBody / Response の型も出す。$ref・allOf / oneOf / anyOf・enum・nullable・additionalProperties に対応し、TypeScript の予約語や重複する名前は付け替えて notes で知らせる。**別ファイル・URLを指す $ref は読みに行かない**(その部分は unknown にして OA_EXTERNAL_REF で指摘)。1ファイルにまとめた仕様書を渡すこと。YAML/JSON の解析は自前(json_to_yaml と同じパーサ。ただし「- 」で始まる折り返し行も description の続きとして読む)。構文の誤りは ok:false と error(code・行・桁・前後の行の抜粋)で返す。spec か path のどちらか一方を渡す(20MBまで)。outputDir を渡すと <タイトル>.md と <タイトル>.ts を書き出す(本文は返さない)。完全ローカル処理・ネットワーク送信なし。

输入参数langpathspecoutputexamplesoutputDiroverwriteoperations

faq_jsonld_generate

FAQ構造化データ(JSON-LD)&Markdown生成

質問と回答のペアから、schema.org の FAQPage 形式の JSON-LD・同じ内容の Markdown・貼り付け用の HTML(details / summary)を同時に作る(tools.first-ch.com/faq-jsonld/ と同一ロジック)。**jsonld_generate(type=faqpage)との違い**: あちらは質問と回答を文字列のまま入れるだけ。こちらは回答を「空行で段落・改行は <br>・[文字](URL) と裸の https://… はリンク・行頭の - ・ と 1. は箇条書き」として読み、JSON-LD の acceptedAnswer.text を HTML(1行だけなら <p> で包まない)か answer_format="text" のプレーンテキストで書き、Markdown(見出し+本文・記号はエスケープ)と details/summary の HTML も返す。bulk に「Q: / Q1. / Q. / 質問:」「A: / 回答:/ 答え:」で始まる行や「## 見出し」で書いた文章をまとめて渡すと、質問と回答に分けて items の後ろへ足す。リンクは http(s)・mailto・tel・/・# だけをリンクにし、javascript: などは文字のまま残して UNSAFE_LINK で指摘する。相対URL(RELATIVE_LINK)・同じ質問の重複(DUPLICATE・全角半角と空白を無視)・片方だけ空の行(SKIPPED・出力しない)も warnings で返す。<script> の中で途切れないよう </script と <!-- と U+2028/2029 をエスケープする。日本語は \u エスケープしない。質問は200件・質問500字・回答5000字まで。完全ローカル処理・ネットワーク送信なし。

输入参数bulklangitemsleveltitleexclusivewrap_scriptanswer_format

lines_process

テキスト行操作(重複削除・並べ替え・行番号)

1行1項目のテキストを整える(tools.first-ch.com/lines/ と同一ロジック)。キーワード・URL・メールアドレス・商品名の一覧の重複削除や並べ替え、箇条書き化といった定型処理に使う。**適用順は固定**: trim(前後の半角/全角空白・タブ・NBSPを削る) → removeBlank(空行と空白だけの行を削る) → dedupe(dedupeMode: first=最初の1行を残す / unique=重複した行は1行も残さない / dupes=重複した行だけを1行ずつ。ignoreCase で大文字小文字を区別しない) → sort(asc / desc / reverse / shuffle。asc・desc は numeric〔既定 true〕で item2 < item10・-3 < 1.25 < 10 と数を数として比べ、数値の行を文字の行より前に置く。照合は日本語の Intl.Collator) → prefix / suffix → number(start・sep: dot / paren / colon / bracket / tab / space・pad でゼロ埋め。接頭辞の外側に付く)。preset(uniqsort=トリム+空行除去+重複削除+昇順 / clean / numbered / mdlist="- " の箇条書き / shuffle)は Web版のボタンと同じ設定から始め、個別の引数で上書きできる。shuffle は seed(0〜4294967295)を渡すと同じ並びを再現でき、渡さなければ暗号学的乱数で偏りなく混ぜる。改行コードは入力の最初のものに揃え、末尾の改行も保つ。どの行が何回出たか(duplicates)と、前後の空白・大文字小文字・全角半角だけが違う「重複しかけ」の組を notes で返す。text か path のどちらか一方を渡す。outputPath を渡すとそのパスへ書き出す(本文は返さない)。完全ローカル処理・ネットワーク送信なし。

输入参数padseplangpathseedsorttexttrimstartdedupenumberprefix另有 8 个

dpi_calc

印刷サイズ・DPI計算(必要ピクセル数・実効dpi・早見表)

印刷物の仕上がりサイズ(mm)と解像度(dpi)から入稿に必要なピクセル数を求め、逆に手持ちの画像のピクセル数から印刷できる大きさと実効dpiを求める(tools.first-ch.com/dpi/ と同一ロジック)。チラシ・名刺・ポスターの入稿データ作成、支給画像が印刷に足りるかの判定に使う。`mode="size"`(既定)は paper(A0〜A6・B1〜B6〔JIS〕・MEISHI〔名刺91×55〕・HAGAKI・PHOTO_L・LETTER など28種。既定 A4)か widthMm/heightMm(自由なサイズ)と dpi(既定350=日本の商業印刷の標準)・bleedMm(塗り足し・片側。既定3)から、仕上がりと塗り足し込みのピクセル数(**端数は切り上げ**)・インチ・画素数・非圧縮のデータ量(RGB/CMYK)・入稿メモ(memo)と指摘(dpiの過不足・塗り足しなし・安全な範囲3mm・PSDの30,000px上限超え・CMYK入稿)を返す。名刺・往復はがき・封筒・チケットは既定で横向き(orientation で変更可)。`mode="reverse"`(width/height を渡すと既定)は画像のピクセル数から、その dpi での印刷サイズ・350dpiでの上限・paper(既定 A4)に使ったときの実効dpi(**用紙の縦横は有利な向きを選ぶ**)と判定(350以上=十分・300以上=実用・200以上=用途しだい・未満=不足)・350dpiに必要なピクセル数・主要12用紙での実効dpi一覧を返す。`mode="table"` は主要12用紙(papers で指定可)の早見表を text / md(Markdownの表)/ csv で返す。`mode="units"`(value を渡すと既定)は mm・cm・inch・px・pt(1/72インチ)・Q(級=0.25mm)を相互換算する(px は dpi で換算)。`mode="papers"` は用紙の一覧。数値は "210mm"・"4,000" のような文字列でも受ける。完全ローカル処理・ネットワーク送信なし。

输入参数dpifromlangmodepapervaluewidthformatheightpapersbleedMmwidthMm另有 2 个

serp_check

SERPメタタグ文字数・ピクセル幅チェック

title / meta description / URL が Google 検索結果でどこまで表示されるかを、文字数ではなく**表示幅(ピクセル)**で判定する(tools.first-ch.com/serp/ の判定部分と同一ロジック。プレビューの描画は除く)。基準はパソコン=結果の幅600px・タイトル20pxで1行・説明文14pxで2行、スマートフォン=380px・タイトル2行・説明文3行(device="both" で両方)。和文は文字単位・欧文は単語単位で折り返し、行頭禁則(、。」など)はぶら下げ・行末禁則(「(など)は次の行へ送る。行数を超えたら最終行を「…」が入る幅まで削り、表示される行(lines)・切り詰められる部分(cut)・幅(width_px / limit_px)・文字数(書記素単位)・状態(ok / cut / short〔上限の半分未満〕/ empty)を返す。指摘(checks)はタイトル・説明文の未入力(fail)、切り詰め・短すぎ・サイト名の区切り(| | - : など)が無い、URL が https でない・パスが4階層以上・%エンコードを含む(warn)。パンくず表示(host › path)と貼り付け用の <title> / <meta name="description"> / <link rel="canonical"> も返す。**ピクセル幅は近似**: Web版はブラウザの canvas で実測するが、ここでは Arial の字幅表と和文=1em で測る(カーニングなし)。ブラウザより数px広く出ることがあり、切り詰めの判定は早め(安全側)に寄る。境目の1〜2文字は目安として扱う。items で500件までまとめて判定できる。URL を取りに行かない。完全ローカル処理・ネットワーク送信なし。

输入参数urllangitemstitledevicedescription

css_layout_generate

Flexbox / CSS Grid のCSS生成

Flexbox / CSS Grid のコンテナと子要素の指定から、コピーして使える CSS と HTML を組み立てる(tools.first-ch.com/css-layout/ と同一ロジック)。レイアウトの実装・コーディング指示の下書き・プロパティの効き方の確認に使う。**既定値と同じ宣言は書かない**(flex-wrap: nowrap・justify-content: flex-start など)、同じトラックが続けば repeat() に畳む、行と列の gap が同じなら1つにまとめる。`mode="flex"`(既定)は display / direction / wrap / justifyContent / alignItems / alignContent / gap と、items(子要素ごとの grow・shrink・basis・alignSelf・order)。`mode="grid"`(columns / rows / areas / autoFit を渡すと既定)は columns・rows(トラックの配列。例: ["240px", "minmax(0, 1fr)"])・autoFit(repeat(auto-fit, minmax(autoFitMin, 1fr)))・flow・justifyItems・alignItems・justifyContent・alignContent と、items(columnSpan・rowSpan)。**areas(grid-template-areas)は自前で検証する**: 行ごとのマス数が揃っているか・名前が長方形か(L字や分断だと CSS は値全体を捨てる)・名前に使えない字・列トラック数との食い違い。行は改行か " / " で区切る("header header / side main")。正しければ名前ごとの grid-area の規則と HTML を出す。notes は効かない組み合わせ(flex-grow があると justify-content が効かない・nowrap で align-content は無意味・1fr トラックで justify-content に余りが無い)と落とし穴(min-width: auto であふれる・1fr の最小値は auto・reverse や dense で読む順がずれる・flexbox の gap は Safari 14.1 以降)。hints は選んだ値の一言解説。preset で定番(center-row / header / card-row / sidebar / holy-grail / auto-fit / mosaic / stack-bottom)から始められ、mode="presets" で全プリセットの CSS を返す。値の範囲は Web 版のフォームと同じ(gap 0〜80px・子要素 flex 8個 / grid 12個まで・grow/shrink 0〜5・order -2〜2・span 1〜6)。プレビューの描画と折り返し行数の実測はブラウザ専用のため返さない。完全ローカル処理・ネットワーク送信なし。

输入参数gapflowlangmoderowswrapareascountitemscolGappresetrowGap另有 9 个

wiki_doc_lint

社内文書の重複・孤立・表記ゆれチェック

Notion・Backlog Wiki・Confluence などから書き出した社内文書(Markdown / HTML / テキスト)を点検する(tools.first-ch.com/wiki-doc-lint/ と同一ロジック)。社内資料の棚卸しや、AIに読ませる前の古い・重複した情報の洗い出しに使う。返すのは①内容がほぼ同じページの組(duplicates: 記号と空白を除いた本文の4文字単位の断片の Jaccard 係数・threshold 以上・それぞれにしかない行・被リンクの多い方〔同数なら本文が長い方〕を残す修正案)②ほかのどのページからもリンクされていない孤立ページ(orphans: Notion 型の親ページか目次ページに足すリンクの1行 addLine つき。index・README・home などの目次ページは entryPages=false にしない限り数えない)③表記ゆれ・旧称(terms: 「揃える表記 ← ゆれ」の辞書〔既定の辞書に dictionary を足す〕と、辞書に無いカタカナ語の語末の長音ゆれ〔多い方に揃える案〕。各箇所の行番号と修正前後の文)④リンク切れ(broken: 文書の拡張子を持つ相対リンクと [[ページ名]] のうち、読み込んだファイルに行き先が無いもの)と、修正案をまとめた Markdown の report。リンクは [文字](パス)・[[ページ名]]・a タグを読み、相対パス・ページ名・Notion のIDつきファイル名・Notion/Confluence のURL末尾のページ名で照合する。コードブロック・インラインコード・URL・HTMLタグは表記ゆれの対象外で、語の途中(ユーザビリティの中のユーザ)は拾わない。paths(ファイルかフォルダーの絶対パス。フォルダーはサブフォルダーまで読み、隠しフォルダーと node_modules は飛ばす)か files({ path, text } の配列)のどちらか一方を渡す。文字コードは UTF-8 / Shift_JIS / UTF-16(BOM)を自動判別。3,000ファイル・合計60MBまで。ZIP は展開してから渡す。ファイルは読むだけで書き換えない。完全ローカル処理・ネットワーク送信なし。

输入参数langfilespathsformatautoChoonthresholddictionaryentryPagesuseDefaultDictionary

fit_to_box

記入欄に収める字の大きさと改行位置

印刷済みの記入欄(市販の中袋〔ご祝儀袋・香典袋〕の「住所」「金額」「氏名」の欄など)に手で書くとき、欄の幅・高さ(mm)と向きから、文字列が収まる1字の大きさ(mm・0.1mm 単位で切り捨て)・行数・改行した後の各行を返す(tools.first-ch.com/nakabukuro-ran/ と同一ロジック)。字の大きさは、欄の線から内側へ1.5mmずつ余白を取り、行間を字の大きさの0.3倍として、行の長さと行数の両方から決める(横書きでは半角英数を全角の0.6字分で数える。上限は住所9mm・金額と氏名14mm・plain 12mm)。`kind="address"`(既定)は住所を「〜番地」と「建物名・部屋番号」の境目で改行し、そこで4mmに届かないときだけ都道府県・市区町村の後や番地の前でも区切る(「12番地の18」「1203号室」など数字の並びの途中では切らない・text に改行を入れるとそこを建物名の前として扱う・最大4行)。postalCode を渡すと「〒」付きの1行を先頭に足す。縦書きの欄では番地の数字を漢数字(numerals: "digits"=一〇型 / "tens"=十型)にする。1字が4mmを下回るときは alternatives に「都道府県を省いた場合」と「建物名を2行にした場合」の大きさと行を返す(省いてよいかは判断しない)。asIs は改行せずに1字5mmで書いたときに欄の外へはみ出す字数。`kind="amount"` は金額(30000・3万・30,000円)を大字(壱・弐・参・四・伍・六・七・八・九・拾・百・阡・萬)の「金参萬円」にして欄に合わせる(1〜99,999,999円・圓/也/「金」「円」が印刷済みに対応)。`kind="name"` は氏名(空白でだけ改行)、`kind="plain"` は任意の文字列。完全ローカル処理・ネットワーク送信なし。

输入参数kindlangnaritext必填width必填height必填yenCharnumeralspostalCodeorientationkinEnPrintedthousandChar

invoice_nebiki_check

インボイス値下げ、応じる前に相手へ聞く3問チェック

インボイス発行事業者でない側(個人のデザイナー・ライターなど)が取引先から値下げを求められたとき、取引先に控除の減り(差)が本当に出るかを時期別に返す(tools.first-ch.com/invoice-nebiki/ と同一ロジック)。入力は3問: method(取引先の申告方式 general=一般課税 / simplified=簡易課税 / niwari=2割特例 / sanwari=3割特例 / exempt=免税事業者・消費者 / unknown)、party(individual / corporation・2割特例と3割特例では必須)、small(1回の請求が税込1万円未満か yes / no / unknown)。monthly(月の請求額・税込10%)と cutRate(%)か cutAmount(円/月)は任意。rows は today を含む時期から、判定が同じ時期をまとめて status=diff(差あり・monthlyDiff=税込×10/110×pct% の1円未満切り捨て)/ none(差なし)/ check(要確認)を返す。pct は経過措置で控除できなくなる割合(2026年9月まで20%・2026年10月から30%・2028年10月から50%・2030年10月から70%・2031年10月から100%)。2割特例の差なしは個人2026年分まで・法人は2026年9月30日を含む課税期間まで、3割特例は個人の2027・2028年分だけで、期限後は recheck:true(方式の再確認が必要・簡易課税へ移ったとは仮定しない)。一般課税で small が yes/unknown なら、少額特例(2029年9月30日までの仕入れ)があるため2029年9月までは要確認。questions と message は要確認の項目だけを尋ねる確認文(要確認が無ければ見込みを伝える文。format="md" で Markdown)。前提(概算・全額控除と保存要件・法人税等を含めない・特例の可否は相手が判断)は premises と message に必ず付く。showAmount:false で金額を出さない。自分の納税額・登録の要否・違法かどうか・相手の方式や規模の推定は扱わない。入力の誤りは InvoiceNebikiError(code 付き)。完全ローカル処理・ネットワーク送信なし。

输入参数langpartysmalltodayformatmethodcutRatemonthlycutAmountshowAmount

reply_check

AIの返信案の送る前チェック(日付・金額・宛名などの照合)

届いたメール(received)と、任意の「自分で決めた事実」(facts:営業時間・料金・日程など)を、AI が書いた返信案(reply)と照らし合わせる(tools.first-ch.com/okurumae/ と同一ロジック)。返信案から日付・曜日・時刻・金額・数量(〇名・〇泊・%)・電話番号・メールアドレス・URL・宛名(〇〇様・Dear Ms. …)・番号を拾い、received と facts のどちらにも無いものを status=red(reasons に missing)、あるものを green、[お客様1]・〇〇・XX・【】・{name} などの消し忘れを yellow(placeholder)で返す。日付と曜日の食い違い(例: 2026年11月8日(金))と存在しない日付も red(weekday / nodate・date に実際の曜日)。年の書かれていない日付は today の60日前〜305日後に入る年で曜日を確かめる。全角/半角・カンマ・「18時30分」と「18:30」・「3千円」と「3,000円」は照合のときだけそろえ、本文は書き換えない。items の start / end は reply の中の位置(JavaScript の文字列の添字=UTF-16)、line / column は1始まり。hits は一致した原文の箇所(1項目5件まで・hitCount は全数)。count は全項目の件数で、items は500件まで(超えたら truncated:true)。赤が0件でも内容の正しさは保証しない(note)。自動修正・文体の添削・伏せ字はしない。各欄2万字まで。入力の誤りは ReplyCheckError(code 付き)。完全ローカル処理・ネットワーク送信なし。

输入参数langfactsreply必填todayreceivedincludeGreen

comfy_png_leak_scan

受け取ったComfyUI画像のキー点検とお知らせ文

ComfyUI の PNG の埋め込みデータ(tEXt・非圧縮 iTXt の prompt・workflow など)から APIキーの形(AIza・sk-・sk-ant-・hf_・r8_)を探す(tools.first-ch.com/comfy-key-leak/ と同一ロジック)。status は found(キーの形あり)/ none(見つからず。安全という意味ではない)/ unchecked(zTXt・圧縮 iTXt・eXIf・caBX・不明なチャンク・IEND の後ろ・30MB超で読めない部分がある)/ failed(CRC 不一致・途中で切れた・PNG でない)。findings の場所は prompt なら nodeId・classType・input、workflow だけなら nodeId と widgetIndex(入力欄名は特定できない・fieldUnknown)。JSON は重複キーの前の値も捨てずに読み、inputs の外(extra)・迂回ノード(bypassed)・JSON の外の文字も拾う。ノードの表示名(title)は使わない。値は返さない(masked=先頭4字+伏せ字と length だけ)。notice はキーの持ち主へのお知らせ文(値・ファイル名なし、有効性と原因は確認していないと書く)。revoke は見つかった種類の公式の無効化画面。outPath を渡すと tEXt・iTXt・zTXt を抜いたコピーを書き、書く前に読み直して文字のチャンク0個・残したチャンクのバイト一致を確かめる(元のファイルは変えない・caBX 付きと壊れた PNG は書き換えない・既存ファイルは overwrite:true が無いと上書きしない)。キーが有効かどうかの確認・URL からの取得・JPEG/WebP の書き換えはしない。このツールはネットワークへ何も送らない。入力は path を優先する: base64 で渡すと画像のバイト列(埋め込まれた生のキーを含む)が会話に載り、モデルの提供元へ渡る(そのとき返り値に inputNote が付く)。

输入参数langpathbase64outPathoverwriteincludeUrl

版本历史

11
  1. v0.51.0最新Nov 7, 2026
  2. v0.50.0Nov 7, 2026
  3. v0.47.1Nov 6, 2026
  4. v0.47.0Nov 5, 2026
  5. v0.45.0Nov 3, 2026
  6. v0.42.1Oct 31, 2026
  7. v0.42.0Oct 31, 2026
  8. v0.41.0Oct 29, 2026
  9. v0.38.0Oct 21, 2026
  10. v0.37.0Oct 20, 2026
  11. v0.4.1Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分