zh-dict-mcp
by outsiderrr
README.md
# zh-dict-mcp
MCP server for Chinese figurative language lookup, backed by CC-CEDICT.
**What it does**: given a Chinese word or phrase, tells you whether its figurative usage has been lexicalized (recorded in the dictionary as an independent sense) or is a one-off creative expression.
**Why it exists**: LLMs writing Chinese dialogue, fiction, or roleplay tend to invent purple-prose figurative expressions that no real person would say (e.g., "他把心锁进铁盒里" / "墙比夜更厚"). This tool gives you an objective dictionary-backed check.
---
## Install
Pick your MCP-aware client. Across all of them the runtime command is the same — `uvx zh-dict-mcp` — but the wrapping config differs.
### Claude Code
```bash
claude mcp add zh-dict-mcp -- uvx zh-dict-mcp
```
### Codex CLI
```bash
codex mcp add zh-dict-mcp -- uvx zh-dict-mcp
```
Or edit `~/.codex/config.toml` directly:
```toml
[mcp_servers.zh-dict-mcp]
command = "uvx"
args = ["zh-dict-mcp"]
```
### Cursor
In Cursor: **Settings → MCP → Add new server** (UI), or edit `~/.cursor/mcp.json`:
```json
{
"mcpServers": {
"zh-dict-mcp": {
"command": "uvx",
"args": ["zh-dict-mcp"]
}
}
}
```
### Claude Desktop
Edit `claude_desktop_config.json` (macOS: `~/Library/Application Support/Claude/`, Windows: `%APPDATA%\Claude\`):
```json
{
"mcpServers": {
"zh-dict-mcp": {
"command": "uvx",
"args": ["zh-dict-mcp"]
}
}
}
```
Restart Claude Desktop to load the server.
### Windsurf / Zed / other MCP-aware clients
The JSON block above is universal — find your client's MCP config file (search for "MCP" in its settings docs) and paste it in.
### With an optional project whitelist
If you have a project-level whitelist of "approved dead metaphors" the dictionary happens to miss, point the server at it:
```json
"args": ["zh-dict-mcp", "--whitelist", "/abs/path/to/your_whitelist.yaml"]
```
Or set the environment variable `ZH_DICT_WHITELIST=/abs/path/to/your_whitelist.yaml`.
---
After install, the `lookup_dictionary` tool is exposed to your AI client. `uvx` pulls the package from PyPI on first run, caches it locally, then launches the stdio MCP server. No `pip install` needed.
---
## What you get
A single MCP tool:
```
lookup_dictionary(word: string) → JSON
```
**Example**: `lookup_dictionary("看见")` returns:
```json
{
"word": "看见",
"found_in_cedict": true,
"simplified": "看见",
"traditional": "看見",
"pinyin": "kan4 jian4",
"definitions": ["to see", "to catch sight of"],
"tags": {
"has_figurative": false,
"is_neologism": false,
"is_slang": false,
"has_idiom_marker": false
}
}
```
**Example**: `lookup_dictionary("内卷")` returns:
```json
{
"word": "内卷",
"found_in_cedict": true,
"definitions": [
"(embryology) to involute; involution",
"(neologism, attested by 2017) (of a society) to become more and more involuted..."
],
"tags": { "is_neologism": true, ... }
}
```
**Example**: `lookup_dictionary("锁进铁盒里")` (a creative one-off) returns:
```json
{
"word": "锁进铁盒里",
"found_in_cedict": false,
"found_in_whitelist": false,
"definitions": []
}
```
---
## Use cases
- **AI-generated dialogue review**: catch live metaphors LLM invents but no real speaker would use
- **AI writing lint**: pipeline filter for game NPC dialogue / interactive fiction / chatbot scripts
- **Lexicalization research**: check whether a figurative expression has been recorded in standard dictionaries
- **New word verification**: confirm neologisms / slang with `(neologism, attested by YEAR)` attribution
- **Idiom / 典故 lookup**: get figurative sense for idioms like "滑铁卢" → "(fig.) a defeat"
---
## Data source
[CC-CEDICT](https://www.mdbg.net/chinese/dictionary?page=cc-cedict) — open Chinese-English dictionary, 12.5万条目, community-maintained, weekly updates.
License: CC BY-SA 4.0. Bundled in package. See `LICENSE-CC-CEDICT`.
Why CC-CEDICT vs 现代汉语词典 (XDHYCD) or other sources:
| Source | Coverage on AI-writing test set | Notes |
|---|---|---|
| chinese-xinhua (GitHub data) | 46% | Heavy classical/古汉语 bias |
| 现代汉语词典 第7版 (XDHYCD7th) | 56% | Doesn't list literal compound words (放下/抓住/等等) |
| **CC-CEDICT** | **~95%** | Modern usage + neologisms + `(fig.)` / `(slang)` / `(neologism)` markers |
CC-CEDICT explicitly tags figurative senses, neologisms with attestation years, slang, and idioms — exactly the structure needed for figurative-language analysis.
---
## Optional: project whitelist
For project-specific overrides (e.g., words CC-CEDICT happens to miss):
```yaml
# my_whitelist.yaml
allowed:
- word: 凛然
note: Standard literary usage, CC-CEDICT misses it
- word: 头疼
note: Override to include "annoyance" figurative sense
```
Pass via CLI:
```json
{
"mcpServers": {
"zh-dict-mcp": {
"command": "uvx",
"args": ["zh-dict-mcp", "--whitelist", "/abs/path/to/my_whitelist.yaml"]
}
}
}
```
Or via env var `ZH_DICT_WHITELIST=/path/to/file.yaml`.
When a word is in the whitelist, the result includes `"found_in_whitelist": true` and the note.
---
## Python API (no MCP needed)
Use the lookup library directly without launching a server:
```python
from zh_dict_mcp import DictionaryLookup
lookup = DictionaryLookup() # bundled CC-CEDICT loads in ~200ms
result = lookup.lookup("滑铁卢")
print(result.found) # True
print(result.definitions) # ['Waterloo (Belgium)', 'Battle of Waterloo (1815)', '(fig.) a defeat']
print(result.tags.has_figurative) # True
print(result.pinyin) # 'Hua2 tie3 lu2'
```
With custom whitelist:
```python
from pathlib import Path
lookup = DictionaryLookup(whitelist_path=Path("my_whitelist.yaml"))
```
`lookup.py` has zero external dependencies (stdlib only). The `mcp` dependency is only needed for the MCP server.
---
## Install standalone (no MCP, just Python library)
```bash
pip install zh-dict-mcp
```
Or with uv:
```bash
uv add zh-dict-mcp
```
---
## Limitations
- **English-language definitions** (CC-CEDICT is a Chinese-English dictionary). Works well with LLMs that handle cross-lingual judgment (Claude, GPT-4+, Gemini). For monolingual Chinese consumers you'd need a translation layer.
- **Sense matching is on the caller** — this tool returns all senses; deciding whether the speaker's intended sense matches a returned sense is left to the LLM or human reviewer.
- **Single-word / single-phrase lookup** — doesn't parse full sentences. Wrap with your own NLP layer for sentence-level work.
- **9.4 MB data bundle** — CC-CEDICT data is included in the wheel for offline use.
---
## How it fits with broader writing-quality pipelines
This tool is one piece of a larger "AI-generated text quality" framework. Typical usage flow:
```
LLM generates Chinese dialogue
↓
Scan for figurative expressions (比喻 / 借代 / 委婉 / ...)
↓
For each: lookup_dictionary(expression)
↓
├── found + sense matches intent → pass
└── not found or sense mismatch → flag for rewrite
```
A reference review prompt for this flow is documented in [Forgewright](https://github.com/outsiderrr/Forgewright) (the project that spawned this tool).
---
## Project status
v0.1.0 — initial release. Validated on a 39-case test set covering 6 categories (dead metaphors / live metaphors / literal words / boundary cases / idioms / neologisms) with 100% accuracy.
Bug reports and PRs welcome.
## License
- **Code**: MIT (see `LICENSE`)
- **CC-CEDICT data**: CC BY-SA 4.0 (see `LICENSE-CC-CEDICT`)
TDQS
A4.4/5.0
Scored across 1 tool
Disambiguation5/5
Only one tool exists, so there is no risk of confusion between tools.
Naming Consistency5/5
With a single tool, naming is trivially consistent.
Tool Count4/5
A single lookup tool is appropriate for a dictionary server, though additional tools for batch lookup or word management could be justified.
Completeness5/5
The tool provides comprehensive coverage: lookup with definitions, pinyin, tags, and support for neologisms, idioms, and figurative language.
Maintenance
ActivityInactive
ResponsivenessNo issues