<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: leonmch</title>
    <description>The latest articles on DEV Community by leonmch (@leonmch).</description>
    <link>https://dev.to/leonmch</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4176921%2Faa53bc5f-d6cb-4835-9662-9ec98175a4bf.png</url>
      <title>DEV Community: leonmch</title>
      <link>https://dev.to/leonmch</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leonmch"/>
    <language>en</language>
    <item>
      <title>MCP</title>
      <dc:creator>leonmch</dc:creator>
      <pubDate>Mon, 12 Oct 2026 08:13:24 +0000</pubDate>
      <link>https://dev.to/leonmch/mcp-4f2n</link>
      <guid>https://dev.to/leonmch/mcp-4f2n</guid>
      <description></description>
    </item>
    <item>
      <title>How to Add Chinese NLP to Your AI Agent in 5 Minutes</title>
      <dc:creator>leonmch</dc:creator>
      <pubDate>Sun, 11 Oct 2026 11:42:17 +0000</pubDate>
      <link>https://dev.to/leonmch/how-to-add-chinese-nlp-to-your-ai-agent-in-5-minutes-57l6</link>
      <guid>https://dev.to/leonmch/how-to-add-chinese-nlp-to-your-ai-agent-in-5-minutes-57l6</guid>
      <description>&lt;p&gt;Most LLMs read Chinese well at the sentence level. What they handle badly is the&lt;br&gt;
mechanical layer underneath: cutting a paragraph into words the way a search&lt;br&gt;
index would, romanising names so they sort correctly, pulling keywords with&lt;br&gt;
weights, or scanning text against a list you maintain yourself.&lt;/p&gt;

&lt;p&gt;Those four operations are cheap to run locally. I packaged them as an MCP server.&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Chinese has no spaces between words, so "我喜欢北京天安门" has to be cut&lt;br&gt;
somewhere, and where you cut it changes what everything downstream sees. Segment&lt;br&gt;
it wrong and your keyword extractor returns fragments, your index misses&lt;br&gt;
matches, your slug generator emits gibberish.&lt;/p&gt;

&lt;p&gt;LLMs guess at this. Ask one to split a paragraph into words and you get something&lt;br&gt;
plausible that does not match any tokenizer on your stack. Ask it to convert&lt;br&gt;
names to pinyin for sorting and it will be right most of the time, which is&lt;br&gt;
harder to catch than a consistent error.&lt;/p&gt;

&lt;p&gt;The usual fix is a cloud API. That works, and it means every document your agent&lt;br&gt;
processes leaves your machine, plus a latency dependency and a cost line.&lt;/p&gt;
&lt;h2&gt;
  
  
  The solution
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;chinese-nlp-mcp&lt;/code&gt; exposes four working tools over stdio, all in-process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;segment_chinese&lt;/code&gt; — jieba segmentation, &lt;code&gt;default&lt;/code&gt; / &lt;code&gt;search&lt;/code&gt; / &lt;code&gt;index&lt;/code&gt; modes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;convert_pinyin&lt;/code&gt; — pypinyin, &lt;code&gt;tone&lt;/code&gt; / &lt;code&gt;tone2&lt;/code&gt; / &lt;code&gt;initials&lt;/code&gt; / &lt;code&gt;first_letter&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;extract_keywords&lt;/code&gt; — TF-IDF extraction with weights&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;detect_sensitive_words&lt;/code&gt; — Aho-Corasick against a caller-supplied word list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus &lt;code&gt;hello_world&lt;/code&gt; for health checks.&lt;/p&gt;
&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx chinese-nlp-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or with pip:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;chinese-nlp-mcp
chinese-nlp-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python 3.10+. Also on PyPI and the Official MCP Registry as&lt;br&gt;
&lt;code&gt;io.github.leonmch-byte/chinese-nlp-mcp&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;Claude Desktop (&lt;code&gt;claude_desktop_config.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chinese-nlp-mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"chinese-nlp-mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cursor (&lt;code&gt;.cursor/mcp.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chinese-nlp-mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"chinese-nlp-mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VS Code (&lt;code&gt;.vscode/mcp.json&lt;/code&gt;) uses &lt;code&gt;servers&lt;/code&gt;, not &lt;code&gt;mcpServers&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chinese-nlp-mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uvx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"chinese-nlp-mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Four product reviews, the kind you get pasted into a ticket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;物流很快，包装完好，质量不错。
客服态度很好，解决问题很耐心。
发货太慢了，等了五天才到。
质量太差了，收到就是坏的，申请退款。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On its own this is fine for an LLM to summarise. But if you want to route it,&lt;br&gt;
group it, or track themes over time, you need keywords first. Ask Claude to call&lt;br&gt;
&lt;code&gt;extract_keywords&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;质量   0.610
发货   0.536
退款   0.531
太慢   0.510
太差   0.500
客服   0.456
五天   0.450
完好   0.431
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Weights are raw TF-IDF, unnormalised, so they exceed 1.0 on longer documents.&lt;br&gt;
&lt;code&gt;质量&lt;/code&gt; and &lt;code&gt;发货&lt;/code&gt; are the themes; &lt;code&gt;退款&lt;/code&gt;, &lt;code&gt;太慢&lt;/code&gt;, &lt;code&gt;太差&lt;/code&gt; are the complaints. That&lt;br&gt;
is a routing decision the LLM can now make on numbers instead of vibes.&lt;/p&gt;

&lt;p&gt;Two more calls make it useful. Scan against your own escalation terms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;detect_sensitive_words&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;reviews&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;退款&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;太差&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;坏的&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;matches&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;word&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;太差&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;index&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
               &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;word&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;坏的&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;index&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
               &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;word&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;退款&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;index&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;clean&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And segment when you need offsets rather than topics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;segment_chinese&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;物流很快，包装完好，质量不错。&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;物流&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;很快&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;，&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;包装&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;完好&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;，&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;质量&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;不错&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;。&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(jieba keeps punctuation as its own token; filter it out if you don't want it.)&lt;/p&gt;

&lt;p&gt;One gotcha worth knowing: &lt;code&gt;initials&lt;/code&gt; and &lt;code&gt;first_letter&lt;/code&gt; are both &lt;strong&gt;per&lt;br&gt;
character&lt;/strong&gt;. &lt;code&gt;中国&lt;/code&gt; is &lt;code&gt;zhong guo&lt;/code&gt;, so you get &lt;code&gt;zh g&lt;/code&gt; and &lt;code&gt;z g&lt;/code&gt;, not &lt;code&gt;zh&lt;/code&gt; and &lt;code&gt;z&lt;/code&gt;.&lt;br&gt;
Take &lt;code&gt;[0]&lt;/code&gt; yourself if you want one letter per word.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free vs Pro
&lt;/h2&gt;

&lt;p&gt;The free tier is 500 &lt;code&gt;segment_chinese&lt;/code&gt;, 300 &lt;code&gt;convert_pinyin&lt;/code&gt;, 100&lt;br&gt;
&lt;code&gt;extract_keywords&lt;/code&gt; and 200 &lt;code&gt;detect_sensitive_words&lt;/code&gt; calls per day, resetting at&lt;br&gt;
00:00 UTC. That covers individual use comfortably. &lt;code&gt;hello_world&lt;/code&gt; is never&lt;br&gt;
throttled, so a health check can never look like a broken server. Hitting a limit&lt;br&gt;
returns an error naming the limit, the reset time and what Pro adds.&lt;/p&gt;

&lt;p&gt;Pro is $19 once, not a subscription. It adds batch processing (100 texts per&lt;br&gt;
call), custom dictionaries and priority support. Batch is the one that matters&lt;br&gt;
if you are running this over a corpus rather than a ticket queue — without it&lt;br&gt;
you pay one round trip per document, and the per-call overhead dominates on&lt;br&gt;
short texts. Custom dictionaries matter if your domain has vocabulary jieba has&lt;br&gt;
never seen, which for most Chinese technical corpora it has.&lt;br&gt;
Ready to upgrade? &lt;a href="https://wolfmanchao.gumroad.com/l/chinese-nlp-mcp-pro" rel="noopener noreferrer"&gt;Get Pro on Gumroad →&lt;/a&gt; — $19 one-time, no subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;Without a license key: fully offline. No network calls, no telemetry. Your text never leaves the machine.&lt;/p&gt;

&lt;p&gt;With a Pro license key: the key is verified against Gumroad once at startup, cached for 24 hours. Only &lt;code&gt;product_id&lt;/code&gt; and &lt;code&gt;license_key&lt;/code&gt; are sent — no text content, no usage statistics, no machine identifiers. You can turn verification off entirely by not setting &lt;code&gt;CHINESE_NLP_LICENSE_KEY&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Either way the tools themselves never make a network call. FastMCP's update check is disabled at startup; jieba, pypinyin and the automaton all run in-process.&lt;/p&gt;

&lt;p&gt;Daily counters live in a local file (&lt;code&gt;%LOCALAPPDATA%&lt;/code&gt; on Windows, &lt;code&gt;~/Library/Application Support&lt;/code&gt; on macOS, &lt;code&gt;$XDG_STATE_HOME&lt;/code&gt; on Linux), signed with HMAC-SHA256. That file holds only a truncated hash of your key, never the key itself, unless you explicitly opt in.&lt;/p&gt;

&lt;p&gt;Two things we state plainly. First, the daily counters are tamper-resistant but not tamper-proof — this is MIT-licensed local software and anyone determined enough can patch it. Second, there is no DRM. Device binding records a hashed machine ID and warns past three devices, but never blocks. Losing a little revenue beats locking out someone who paid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/leonmch-byte/chinese-nlp-mcp" rel="noopener noreferrer"&gt;https://github.com/leonmch-byte/chinese-nlp-mcp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segmentation bugs are the interesting reports. If jieba gets a name, a jargon&lt;br&gt;
term or a domain term wrong, that is the bug I want to hear about. So is&lt;br&gt;
feedback on whether &lt;code&gt;search&lt;/code&gt; should be the default mode, and on whether&lt;br&gt;
&lt;code&gt;initials&lt;/code&gt; needs a word-level variant.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>mcp</category>
      <category>nlp</category>
    </item>
  </channel>
</rss>
