Hand the dictionary to your LLM.
An MCP server over the whole database — 4,974 traditional Chinese characters and 30,117 words with real frequency ranks, Taiwan readings and TOCFL levels, searchable by meaning or pinyin. One line of config and your model looks the answer up instead of recalling it. No key, no account.
Paste it into Claude Code, Cursor, or any agent — it registers the server and checks the connection for you.
Connect a client
The server speaks the Model Context Protocol over Streamable HTTP, so most clients need nothing but the URL. Add this to your client's MCP config — Claude Desktop's claude_desktop_config.json, Cursor's ~/.cursor/mcp.json, or the equivalent panel — then restart it.
{
"mcpServers": {
"taiwan-mandarin": {
"url": "https://mcp.taiwanmandarin.com"
}
}
}claude mcp add --transport http taiwan-mandarin https://mcp.taiwanmandarin.com
Some clients can only launch a local process. Bridge to the HTTP endpoint with mcp-remote:
{
"mcpServers": {
"taiwan-mandarin": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.taiwanmandarin.com"]
}
}
}Once connected, the client discovers the 9 tools below on its own. Ask it something like “what's the difference between 你 and 您?”, “how do you actually say computer in Taiwan?” or “give me the 20 most common words built on 學” and watch it call them.
The 9 tools
Each one is a read against the same database that backs the pages on this site. The descriptions below are verbatim what the model is given.
Look up a single Chinese character (traditional). Returns Taiwan frequency rank, pinyin (multiple readings when applicable), bopomofo, English definition, TOCFL level, radical, stroke count, and common words built on this character (example_words, derived from word_chars).
| Name | Type | Notes |
|---|---|---|
| char | stringrequired | The character itself (e.g. 我, 學). Single CJK character; surrogate pairs allowed (some rare chars are 2 UTF-16 code units, hence maxLength 4). |
List traditional Chinese characters filtered by rank range, radical, or stroke count, ordered by Taiwan (COCT) frequency. Use for queries like 'top 20 characters', 'all characters with the 木 radical', or '7-stroke characters'.
| Name | Type | Notes |
|---|---|---|
| minRank | integer | Taiwan frequency rank >= this value. |
| maxRank | integer | Taiwan frequency rank <= this value. |
| radical | string | Exact radical character (e.g. 木). |
| strokes | integer | Exact stroke count. |
| page | integerdefault 1 | 1-indexed page of results, max 1000. |
| pageSize | integerdefault 20 | Default 20, max 100. (The JSON API defaults to 100 and caps at 500; this tool uses tighter bounds to keep MCP token costs reasonable.) |
Look up a single traditional Chinese word — a multi-character vocabulary item such as 電腦 or 謝謝. Returns Taiwan frequency rank, pinyin, bopomofo, English definition, TOCFL level and part of speech, plus the full record for each component character, so the word can be explained from its parts. Use get_character for a single glyph.
| Name | Type | Notes |
|---|---|---|
| word | stringrequired | The word itself, in traditional characters (e.g. 電腦, 謝謝). Exact match — no pinyin, no simplified forms; use search to find a word from English or pinyin. |
List traditional Chinese words ordered by Taiwan (COCT) frequency — the vocabulary side of the database. Filter by frequency rank, or by a character the word must contain: `contains: 學` returns the words built on 學, which is how a learner turns one known character into usable vocabulary. Lists only words carrying a frequency rank; for a graded level's complete vocabulary use list_tocfl_terms.
| Name | Type | Notes |
|---|---|---|
| minRank | integer | Taiwan frequency rank >= this value. |
| maxRank | integer | Taiwan frequency rank <= this value. maxRank=100 is the 100 most common. |
| contains | string | One character. Returns the words containing it anywhere (學 → 學生, 大學, 同學). |
| page | integerdefault 1 | 1-indexed page of results, max 1000. |
| pageSize | integerdefault 20 | Default 20, max 100. |
List the Kangxi radicals in use — the semantic components characters are built from, and the traditional way of indexing a dictionary. Each entry carries the radical glyph, its Kangxi ordinal (1-214), a one-word English gloss (木 → tree), and how many characters in the inventory use it. Radicals with no characters are omitted. Pass a glyph to list_radical_characters, or to the `radical` filter on list_characters.
Takes no arguments.
List the characters built on one Kangxi radical, most useful first — Taiwan frequency, then stroke count. The response also carries the radical's ordinal and English gloss. Use this to answer 'what else uses 水?' or to teach a radical as a group. It differs from list_characters' `radical` filter in that it includes characters the frequency corpus never attests, and orders by stroke count within equal frequency, which is how a paper dictionary arranges them.
| Name | Type | Notes |
|---|---|---|
| radical | stringrequired | The radical glyph, from list_radicals (e.g. 木, 水, 心). Must be one of the 214 Kangxi radicals — a character that merely contains one won't do. |
| page | integerdefault 1 | 1-indexed page of results, max 1000. |
| pageSize | integerdefault 20 | Default 20, max 100. |
List the 7 TOCFL (華語八千詞) proficiency levels — Taiwan's official graded vocabulary scale, traditional script. Returns each level's slug, display name, and entry count (characters + words). Pass the returned slug to list_tocfl_terms. Note the display names are NOT the ordinals: 1=Novice 1, 2=Novice 2, 3=Level 1, 4=Level 2, 5=Level 3, 6=Level 4, 7=Level 5.
Takes no arguments.
List the vocabulary at one TOCFL level — characters and/or multi-character words from the 華語八千詞 list (traditional script), ordered by Taiwan frequency (unranked entries last). Each entry carries pinyin, bopomofo, English definition, part of speech, and frequency rank. Call list_tocfl_levels first to get the level slug. Use this for queries like 'TOCFL Level 1 words' or 'beginner Taiwan vocabulary'.
| Name | Type | Notes |
|---|---|---|
| level | stringrequired | Level slug from list_tocfl_levels: novice-1, novice-2, level-1, level-2, level-3, level-4, level-5. |
| kind | stringdefault both | char = single-character entries only; word = multi-character words only; both = all (default). |
| page | integerdefault 1 | 1-indexed page of results, max 1000. |
| pageSize | integerdefault 20 | Default 20, max 100. |
Find characters and words by meaning or pronunciation, when you don't have the glyph: English ("computer"), pinyin with or without tone marks or numbers ("diannao", "diàn nǎo", "dian4nao3"), or the traditional characters themselves. Results are ordered by match quality — exact reading first, then a definition that leads with the searched meaning, then Taiwan frequency. Reach for this before asserting how something is said or written in Taiwan; use get_character / get_word instead when you already have the exact term. Lexical search, not semantic: it matches readings and definition wording, so a near-synonym the gloss doesn't use won't be found.
| Name | Type | Notes |
|---|---|---|
| query | stringrequired | English meaning, pinyin, or traditional Han text. A single word or short phrase — the longest term drives the meaning ranking. |
| kind | stringdefault both | char = single characters only; word = multi-character vocabulary only; both = each searched and returned separately (default). |
| limit | integerdefault 10 | Maximum results per kind. Default 10, max 50. |
How the endpoint behaves
Every request is a self-contained JSON-RPC 2.0 POST to https://mcp.taiwanmandarin.com. There is no session to open and no server→client stream: a GET asking for text/event-stream gets a 405, which the spec allows. A plain GET from a browser gets a small JSON description of the service instead.
Reported in the initialize result, along with the server's name and tool capability.
Public and read-only. No keys, no OAuth, no cookies — and Access-Control-Allow-Origin: *, so a browser-based client can connect directly.
A malformed call returns a JSON-RPC error object; a lookup that finds nothing returns a tool result with isError: true and a readable message, which is what lets the model recover on its own.
curl -s https://mcp.taiwanmandarin.com \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'curl -s https://mcp.taiwanmandarin.com \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":
{"name":"get_character","arguments":{"char":"水"}}}'