<?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: Prodip Sarker</title>
    <description>The latest articles on DEV Community by Prodip Sarker (@dip_pro).</description>
    <link>https://dev.to/dip_pro</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2019068%2Fa562eaea-3561-4ffe-8f3e-f3bb9efed092.JPG</url>
      <title>DEV Community: Prodip Sarker</title>
      <link>https://dev.to/dip_pro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dip_pro"/>
    <language>en</language>
    <item>
      <title>I Built an MCP Server That Keeps Your i18n Translations in Sync (With AI)</title>
      <dc:creator>Prodip Sarker</dc:creator>
      <pubDate>Fri, 17 Apr 2026 14:07:17 +0000</pubDate>
      <link>https://dev.to/dip_pro/i-built-an-mcp-server-that-keeps-your-i18n-translations-in-sync-with-ai-3mom</link>
      <guid>https://dev.to/dip_pro/i-built-an-mcp-server-that-keeps-your-i18n-translations-in-sync-with-ai-3mom</guid>
      <description>&lt;p&gt;Description: LinguaGuard is a Model Context Protocol server that detects missing keys, removes dead translations, and uses Claude AI to auto-suggest translations — all from your editor.&lt;br&gt;
Ever shipped a feature and forgot to add the French translation? Or found 200 unused keys rotting in your locale files? Yeah. Same.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;LinguaGuard&lt;/strong&gt; — an MCP server that plugs into Claude Desktop (or any MCP-compatible editor) and gives your AI assistant superpowers over your i18n files.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;7 tools, zero config (if you use env vars):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;find_missing_keys&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which keys exist in English but not in &lt;code&gt;fr&lt;/code&gt;, &lt;code&gt;bn&lt;/code&gt;, &lt;code&gt;ar&lt;/code&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;find_unused_keys&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scans your JS/TS/Vue/Svelte source — finds keys defined but never called&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sync_key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adds a key to ALL language files at once (with &lt;code&gt;[TODO]&lt;/code&gt; placeholders)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check_naming_convention&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enforces &lt;code&gt;snake_case&lt;/code&gt; / &lt;code&gt;camelCase&lt;/code&gt; / &lt;code&gt;kebab-case&lt;/code&gt; across all keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;i18n_health_report&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full dashboard — completeness %, health score out of 100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;suggest_translations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Claude AI translates your missing keys automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ci_guard&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pass/fail check for CI pipelines — blocks merges with missing keys&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  The AI translation part
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;suggest_translations&lt;/code&gt; uses the Claude API to fill in missing keys across languages. You set &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;, run the tool, get back a reviewed list of suggestions. It does NOT auto-write — you review, then apply with &lt;code&gt;sync_key&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;en.json&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;"auth.forgot_password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Forgot your password?"&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;After&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;suggest_translations:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;fr:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mot de passe oublié ?"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;bn:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"আপনার পাসওয়ার্ড ভুলে গেছেন?"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ar:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"هل نسيت كلمة المرور؟"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setup in 2 minutes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;claude_desktop_config.json&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;"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;"linguaguard"&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;"npx"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"linguaguard"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"LOCALES_PATH"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./src/locales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"LANGUAGES"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en,fr,bn,ar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"PRIMARY_LANG"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-ant-..."&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;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;Then ask Claude: &lt;em&gt;"Check my i18n health"&lt;/em&gt; or &lt;em&gt;"Find all missing French translations"&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Works with any framework
&lt;/h2&gt;

&lt;p&gt;React, Vue, Svelte, Next.js — anything that uses flat or nested JSON locale files.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/prodip2416/linguaguard" rel="noopener noreferrer"&gt;linguaguard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love feedback — especially if you work with RTL languages (Arabic, Hebrew, Persian) or have nested key structures. PRs welcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Node.js, TypeScript, MCP SDK, and Claude API.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>typescript</category>
      <category>node</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
