by sysprog21
A linguistic linter for Traditional Chinese (zh-TW)
# Add to your Claude Code skills
git clone https://github.com/sysprog21/zhtw-mcpLast scanned: 5/27/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-05-27T08:05:37.662Z",
"semgrepRan": false,
"npmAuditRan": true,
"pipAuditRan": true
}See how zhtw-mcp compares with popular alternatives.
zhtw-mcp is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by sysprog21. A linguistic linter for Traditional Chinese (zh-TW). It has 478 GitHub stars.
Yes. zhtw-mcp passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/sysprog21/zhtw-mcp" and add it to your Claude Code skills directory (see the Installation section above).
zhtw-mcp is primarily written in Rust. It is open-source under sysprog21 on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh zhtw-mcp against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
A linguistic linter for Traditional Chinese (zh-TW) that enforces Taiwan Ministry of Education (MoE) standards on vocabulary, punctuation, and character shapes. It plugs into AI coding assistants through the Model Context Protocol (MCP) and catches Mainland Chinese (zh-CN) regional drift before it reaches the user.
The tool enforces three official Taiwan standards:
Over 1100 vocabulary rules and 15 casing rules are compiled into the binary. For ambiguous terms, the server asks the AI assistant it runs inside for help deciding -- no extra API keys required.
In the late Qing dynasty, scholars had to express Western concepts in a writing system with no native vocabulary for them. Whether coining new words or importing translations via Japanese (和製漢語), they assembled a literary system under enormous time pressure. Many translated terms were inconsistent, ambiguous, or contradictory. The Chinese-speaking world has lived with these deficiencies for over a century.
The PRC simplification effort reduced not just stroke counts but vocabulary precision. Terms that should vary by domain got flattened into single catch-all translations. Many PRC translations were coined hastily: if a term worked in one context, it spread uncritically to others.
AI language models learn from web text where Simplified Chinese vastly outweighs Traditional Chinese (roughly 2.6:1 in CC-100). Major datasets like CulturaX do not even track Traditional Chinese separately. A FAccT 2025 study confirmed that most models favor zh-CN terminology when asked to write zh-TW. The output looks plausible but is not how people in Taiwan actually write.
This goes beyond character conversion. The same word often means different things across the strait:
| English | zh-CN | zh-TW | Why it matters |
|---|---|---|---|
| concurrency | 並發 | 並行 | In zh-CN, 並行 means "parallel" -- a different concept entirely |
| parallel | 並行 | 平行 | zh-CN 並行 = "parallel"; in Taiwan, 並行 = "concurrent" |
| process (OS) | 進程 | 行程 | 進程 in Taiwan means "progress," not an OS process |
| file / document | 文件 / 文檔 | 檔案 / 文件 | 文件 in China = "file"; in Taiwan = "document" |
| render | 渲染 | 算繪 | 渲染 in Taiwan = "exaggerate" (a painting technique) |
| traverse | 遍歷 | 走訪 | 遍歷 in Taiwan is reserved for Ergodic theory (遍歷理論) |
Automatically check and correct zh-TW text produced by AI, catching cross-strait terminology leaks:
, . :) that should be full-width (, 。 :)"" curly quotes replaced with Taiwan-style 「」 corner bracketsThese standards are enforced through two profiles on the strictness axis, plus orthogonal capability flags:
| Profile | Purpose |
|---|---|
base |
Cross-strait vocabulary, punctuation, casing, grammar, politically colored terms |
strict |
Full MoE enforcement: character variants (裏→裡), grammar (臺/台), all punctuation |
| Flag | Purpose |
|---|---|
relaxed |
Relaxed for software UI: disables colon/dunhao enforcement and grammar checks; uses en-dash for ranges |
detect_ai |
AI writing review: filler phrase detection, semantic safety words, copula/passive voice checks, density-based pattern detection |
spacing |
CJK boundary policy, --spacing require|strip: require stores spaces (default); strip leaves the gap to a controlled HTML renderer. The one flag here that takes a value, and a different thing from --off spacing, which turns the whole family off |
For unsupported authority attributions, select document_genre in MCP or
--document-genre casual|technical|financial in the CLI. The check runs only
with AI detection on (--detect-ai / detect_ai), and never suggests an edit
in any genre: deleting an attribution changes what the sentence claims, so the
genre selects the advice rather than a rewrite. Casual prose is told to name
the source or drop the appeal; technical and financial prose are told the
claim needs a citation.
Profiles control how strict the zh-TW norm enforcement is. Flags are orthogonal -- detect_ai works with either profile, relaxed can combine with strict if you want variant normalization but lenient punctuation.
spacing=require is the default because source text also appears outside CSS-capable renderers. Projects that control their HTML can select strip and use text-autospace, a Baseline newly-available property since November 2025. UTR #59 is a draft for layout-time autospacing, not a requirement to remove source-text spaces. Either way the policy governs the U+0020 space, and only where CJK meets an ASCII letter or an ASCII digit.
See docs/rules.md for the full rule reference.
This project follows BCP 47. The region subtag comes from ISO 3166-1 alpha-2, where "region" can denote a sovereign state, territory, or economic area -- not necessarily a "country."
zh-CN: Chinese as written in the CN region (Simplified)zh-TW: Chinese as written in the TW region (Traditional)Throughout the codebase, cn and tw denote regional writing conventions, not a political statement.
Every successful push to main refreshes the rolling latest release, which is what GitHub reports as the latest release. No version tag is involved. Each archive holds the binary, LICENSE, and README.md, and SHA256SUMS ships next to them.
| Platform | Asset |
|---|---|
| Linux x86_64 (glibc 2.39 or newer) | zhtw-mcp-x86_64-unknown-linux-gnu.tar.gz |
| Linux arm64 (glibc 2.39 or newer) | zhtw-mcp-aarch64-unknown-linux-gnu.tar.gz |
| macOS arm64 | zhtw-mcp-aarch64-apple-darwin.tar.gz |
| Windows x86_64 | zhtw-mcp-x86_64-pc-windows-msvc.tar.gz |
On any other platform, use Nix below or build from source.
The browser extension is packaged onto the same release as
zhtw-mcp-extension.zip. Unpack it and load it through chrome://extensions
with developer mode on.
base=https://github.com/sysprog21/zhtw-mcp/releases/download/latest
case "$(uname -sm)" in
"Darwin arm64") asset=zhtw-mcp-aarch64-apple-darwin.tar.gz ;;
"Linux x86_64") asset=zhtw-mcp-x86_64-unknown-linux-gnu.tar.gz ;;
"Linux aarch64") asset=zhtw-mcp-aarch64-unknown-linux-gnu.tar.gz ;;
*) asset=""; echo "no pre-built binary for $(uname -sm)" >&2 ;;
esac
[ -n "$asset" ] &&
curl -fsSLO "$base/$asset" -O "$base/SHA256SUMS" &&
shasum -a 256 --ignore-missing -c SHA256SUMS &&
tar -xzf "$asset" zhtw-mcp
On Linux without shasum, use sha256sum --ignore-missing -c SHA256SUMS instead.
$base = "https://github.com/sysprog21/zhtw-mcp/releases/download/latest"
$asset = "zhtw-mcp-x86_64-pc-windows-msvc.tar.gz"
irm "$base/$asset" -OutFile $asset
irm "$base/SHA256SUMS" -OutFile SHA256SUMS
$want = ((Select-String -Path SHA256SUMS -SimpleMatch $asset).Line -split '\s+')[0]
if ((Get-FileHash -Algorithm SHA256 $asset).Hash -ine $want) { throw "checksum mismatch" }
tar -xzf $asset zhtw-mcp.exe
Both snippets leave the binary in the current directory; move it somewhere on your PATH to run it by name.
On any system with Nix and flakes enabled:
# builds and drops into a temporary shell with `zhtw-mcp` on `$PATH`
nix shell "github:sysprog21/zhtw-mcp"
# builds and runs zhtw-mcp (you can use this command to register with an MCP
# client as shown in the Installing section)
nix run "github:sysprog21/zhtw-mcp"
Note: The first run compiles the project from source, which can take several minutes. Subsequent runs reuse the Nix store cache and start instantly. To speed up the initial build, run
nix build --cores 0 "github:sysprog21/zhtw-mcp"first. And--cores 0tells Nix to use all available CPU cores.
Requires stable Rust 1.91+.
make
The binary is at target/release/zhtw-mcp.
Python 3 is a build requirement, not just a test requirement: the OpenCC conversion tables are generated rather than committed.
make check # the gate CI runs: tests, clippy, formatting, hooks
make indent # run the formatters; the gate checks their result
make hooks # install the git hooks; uninstall-hooks removes them
make corpus # precision, recall and false-positive metrics
scripts/indent.sh holds the formatter chain: comment reflow with
commentflow, then cargo fmt, black, shfmt, and the assets/ruleset.json
normalization that scripts/check-ruleset.py owns. make indent runs