kaeris-mcp
The kaeris-mcp server provides AI-native localization services, enabling MCP clients to discover, audit, and translate application strings into 46 languages with robust quality assurance. Capabilities include:
Discover i18n setup: Scan repositories to detect locale files, base language, target languages, and frameworks (i18next, Flutter, Android, iOS, gettext, etc.) — local only.
Health checks: Audit target locales against the source for missing/extra keys and placeholder mismatches — local, no translation cost.
List missing keys: Get precise lists of missing or broken keys in a specific locale with source text.
List supported languages: Retrieve mapping of all 46 target language codes to English names.
Translate inline strings: Translate key-value pairs with placeholder safety, overflow warnings, back-translation verification, tone (formal/casual), context, glossary, ICU MessageFormat support, and translation memory.
Translate files: Translate entire locale files (JSON, YAML, .po, ARB, XML, CSV, XLIFF, .properties, RESX, .ftl) into multiple languages, with incremental mode using a
kaeris.lockfile to only re-translate new/changed keys.Bootstrap new languages: Create a new target locale by translating the source file into a language not yet present.
Customization: Control translations via tone, context, ICU preservation, and a keep list for untranslated terms.
Authentication: Free and paid tiers; use
KAERIS_API_KEYorKAERIS_OPENROUTER_KEYfor higher limits or BYOK models.
Supports scanning and translating Android string resources (strings.xml) and locale files. Includes tools for detecting Android projects and checking translation status.
Supports scanning and translating Flutter ARB localization files. Includes tools for detecting Flutter projects and managing translations.
Supports scanning and translating i18next JSON locale files. Includes tools for detecting i18next projects and incremental translation.
Supports scanning and translating iOS .strings files. Includes tools for detecting iOS projects and checking translation completeness.
Supports translation of XML locale files (e.g., Android strings.xml). Includes tools for translating with structure preservation.
Supports translation of YAML locale files. Includes tools for translating content with placeholder safety.
KAERIS i18n — MCP Server
AI-native localization over the Model Context Protocol. Give Claude Desktop, Cursor, Claude Code (or any MCP client) the ability to translate your app's strings into 46 languages — placeholder-safe, format-aware, incremental, with built-in Translation QA.
Tools
Tool | What it does | Calls the API? |
| Discover a repo's i18n setup: locale files found, base language, target languages, framework guess (i18next/next-intl/vue-i18n/Flutter/Android/iOS/gettext/generic) | No |
| Completeness/health per target locale — missing keys, extra keys, placeholder mismatches, plus the quality detectors that gate a merge in CI: number drift, lost inline tags, broken entities/escapes, ICU/CLDR plural gaps (same verdict as | No |
| The exact missing/broken keys (with source text) for one target locale, so an agent knows exactly what to fix | No |
| List all supported target languages | No |
| Translate inline strings → per-language results, with QA (placeholder-loss & UI-overflow flags; | Yes |
| Translate a file on disk (JSON/YAML/.strings/.po/ARB/XML/CSV/XLIFF/.properties/.resx/.ftl), optional incremental — reproducible via | Yes |
| Bootstrap a brand-new target locale by translating the whole source file into it | Yes |
The first four tools are local-only (no network call, no cost) — an agent can use them freely to audit and understand a repo's i18n before deciding what (if anything) to translate.
Related MCP server: PO Translation MCP Server
Reproducible by design
kaeris_translate_file with incremental=True keeps a kaeris.lock next to your source file —
the same lock the CLI writes, so an agent and a human sharing a repo stay in sync. It records a
hash of every source string plus the settings that produced it: tone, glossary, app context, and the
model. That means:
Edit one string — only that string is re-translated; everything else stays byte-for-byte.
Change tone, glossary or context — the whole locale is re-translated, never a mix of old and new.
Change plan — every tier runs the same model (Gemini 2.5 Flash-Lite), so upgrading does not force a re-translation. The lock records the model regardless: the day we change it, the locale is rebuilt in full instead of quietly ending up the work of two models.
Commit kaeris.lock alongside your source file so the agent, your teammates and CI all agree on
what is already done.
Install
pip install kaeris-mcpOr run it with Docker
docker build -t kaeris-mcp .
docker run -i --rm -v "$PWD:/work" -w /work kaeris-mcpThe server speaks JSON-RPC over stdin/stdout, so there is no port to expose —
-i is what keeps the conversation open. Mount your project at /work and the
repo-aware tools (scan_repo, status, list_missing_keys) read it directly;
pass -e KAERIS_API_KEY=… for the paid tiers.
Configure your client
Claude Desktop — add to claude_desktop_config.json
(macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):
{
"mcpServers": {
"kaeris-i18n": {
"command": "kaeris-mcp",
"env": {
"KAERIS_API_KEY": "kaerisp_optional_for_pro_team"
}
}
}
}Cursor — Settings → MCP → Add, or .cursor/mcp.json:
{ "mcpServers": { "kaeris-i18n": { "command": "kaeris-mcp" } } }Claude Code — one command:
claude mcp add kaeris-i18n kaeris-mcpRestart the client; the KAERIS tools appear automatically.
Auth & tiers (all optional)
Env var | Purpose |
| Pro/Scale key — higher limits (else the free 10k-char tier is used) |
| OpenRouter key for Lifetime/BYOK — no monthly volume cap |
| Override the API base URL |
No key is required to try it — the free anonymous tier works out of the box.
Example prompts
"Translate the strings in
locales/en.jsoninto German, Ukrainian and Japanese.""Add French and Spanish translations for these buttons: Save, Cancel, Delete."
"Only translate the new keys I added to en.json — don't redo the whole file."
"Check this repo's i18n and tell me what's missing or broken." (scans, then reports status — no API call)
"We don't have Ukrainian yet — add it." (bootstraps a new locale via translation)
License
MIT
Available Tools
7 toolskaeris_add_languageA
Bootstrap a BRAND-NEW target locale by translating the entire source file into it and writing the result. Use this when kaeris_scan_repo/kaeris_status show a language with no locale file at all yet (in "missing_files").
This CALLS THE TRANSLATION API (same as kaeris_translate_file) — unlike kaeris_scan_repo/kaeris_status/kaeris_list_missing_keys, which are local-only and free. For an EXISTING locale that's just missing a few keys, prefer kaeris_translate_file(..., only_new=True) so you don't re-translate the whole file.
Args: source: path to the base-language locale file, e.g. "locales/en.json". lang: the new target language code to create, e.g. "de". out: output directory (default: source file's own directory). tone: "formal" or "casual" to steer register; "" (default) is neutral. icu: True if the source uses ICU MessageFormat (plurals/select), so the model preserves the syntax instead of translating it. keep: optional list of terms to NEVER translate (brand/product names). context: one line about what the app IS, e.g. "a mobile bank for teenagers" or "a wildlife documentary app". The model uses it to pick the right sense of ambiguous strings — "Bank" becomes Ufer in the second and Bank in the first. You are reading the repo, so you know this: pass it. Max 300 chars. api_key / openrouter_key: optional auth overrides (else free tier or env vars).
Returns: { "written": ["/.json"], "lang": "de", "languages": ["de"] }
| Name | Required | Description | Default |
|---|---|---|---|
| icu | No | ||
| out | No | ||
| keep | No | ||
| lang | Yes | ||
| tone | No | ||
| source | Yes | ||
| api_key | No | ||
| context | No | ||
| openrouter_key | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that this 'CALLS THE TRANSLATION API (same as kaeris_translate_file)' and is not free unlike local-only siblings. It explains parameter effects (tone, icu, keep) and the meaning of context with a concrete example. It also states the return format. This is richly transparent beyond just saying it translates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but every sentence earns its place due to the tool's complexity (9 params, cost implications, alternatives). It is structured with a clear 'Args:' section and a 'Returns:' section, front-loading the key usage guidance and API call warning. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 9 parameters, no output schema, and no annotations, the description provides complete context: purpose, usage triggers, alternatives, parameter semantics, and return value. It even includes guidance on how to obtain context (from reading the repo). An agent can select and invoke this tool correctly without additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It does: every parameter gets an explanation and often an example (source: 'locales/en.json', lang: 'de', tone: 'formal'/'casual', icu: 'preserves plural/select syntax', keep: 'brand/product names', context: with the 'Bank' example, api_key/openrouter_key as auth overrides). This fully covers all 9 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Bootstrap a BRAND-NEW target locale by translating the entire source file into it and writing the result,' which is a specific verb+resource action. It further distinguishes from siblings by stating when to use it (when a language has no locale file at all in 'missing_files') and contrasts it with kaeris_translate_file for existing files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides usage context: 'Use this when kaeris_scan_repo/kaeris_status show a language with no locale file at all yet.' It also gives an alternative: 'For an EXISTING locale that's just missing a few keys, prefer kaeris_translate_file(..., only_new=True)' and highlights the cost difference (API call vs local-only). This is clear when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kaeris_list_languagesA
List every target language KAERIS can translate into.
Returns a mapping of language code → English name (e.g. {"es": "Spanish", ...}). Use the codes with kaeris_translate / kaeris_translate_file.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the return format (mapping of language code to English name) and provides an example. This makes the behavior predictable, though it could be more explicit about being a read-only operation with no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences plus an example, with zero waste. The purpose is front-loaded in the first sentence, and the example clarifies the output format. This is an ideal length for a simple list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema), the description is quite complete. It explains what is returned and how to use the result with other tools. It could additionally mention that the list is static or that no authentication is needed, but that is likely inferred from the context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so the schema conveys no additional information. The baseline for 0 params is 4, and the description doesn't need to add parameter details. It correctly mentions nothing about parameters, which is fine since there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('List every target language') with a specific resource ('KAERIS can translate into'). It includes a concrete example ('{"es": "Spanish", ...}') and distinguishes itself from sibling tools like kaeris_translate or kaeris_add_language, which perform different actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage instructions: 'Use the codes with kaeris_translate / kaeris_translate_file.' This tells the agent when to use this tool's output. However, it does not mention alternative tools or explicitly say when not to use it, which would be needed for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kaeris_list_missing_keysA
The exact keys missing or placeholder-broken in ONE target locale, with their source-language text, so an agent knows exactly what to translate/fix. Every supported format works (JSON offline; others via the backend /api/parse, no cost) — use kaeris_add_language or kaeris_translate to actually fill them in.
Args: source: path to the base-language locale file, e.g. "locales/en.json" or "app_en.arb". lang: the target language code to inspect, e.g. "de". out: directory containing the target locale file (default: source's own directory; expected at "/", e.g. de.json / de.arb).
Returns: { "lang": "de", "missing_file": bool, "missing": ["<dotted.key>", ...], # present in source, absent in target "missing_values": {"<dotted.key>": "", ...}, "extra": ["<dotted.key>", ...], # present in target, absent in source "placeholder_issues": [{"key","missing","added"}, ...] }
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | ||
| lang | Yes | ||
| source | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses what the tool returns (missing keys, missing values, extra, placeholder issues), notes that JSON works offline while other formats go through the backend '/api/parse' at no cost, and implies a read-only operation by listing keys rather than modifying files. It lacks explicit side-effect or permission information, but the read-only nature is strongly implied. This is solid disclosure for a list-type tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a lead purpose sentence, a brief note on formats/alternatives, then an 'Args' section and 'Returns' section. Every sentence provides value, and the most critical information is front-loaded. The length is justified by the need to document args and return shape, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 3 parameters (all explained in detail), no output schema (but the Returns section fully describes the response shape), and a moderately complex task (finding missing/placeholder-broken keys). The description also covers format compatibility and next-step alternatives, so an agent has all necessary context to select and invoke the tool correctly. No gaps are evident.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does thoroughly. It explains 'source' with examples ('locales/en.json'), 'lang' with a code example ('de'), and 'out' including its default behavior and expected file naming ('<out>/<lang><source-ext>'). This adds meaning well beyond the bare schema fields, making the tool fully usable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'The exact keys missing or placeholder-broken in ONE target locale... so an agent knows exactly what to translate/fix.' It uses a specific verb ('list' implied) and resource, and distinguishes from translation tools by noting 'use kaeris_add_language or kaeris_translate to actually fill them in.' This is unambiguous and differentiates from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear use context: to identify what needs translation/fixing. It explicitly names alternatives for the next step: 'use kaeris_add_language or kaeris_translate to actually fill them in.' However, it does not explicitly contrast with other sibling tools like kaeris_scan_repo or kaeris_list_languages, leaving some ambiguity about when to choose this over those. Still, the primary usage is well communicated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kaeris_scan_repoA
Discover a repo's i18n setup: which locale files exist, what the base (source) language and target languages are, and which framework/convention is in use. Purely local — reads the filesystem, makes no API call.
Use this FIRST when asked to "look at/audit/fix this repo's i18n" and you don't already know the source file — it tells you where to point kaeris_status / kaeris_list_missing_keys / kaeris_add_language.
Supports i18next/react-i18next (locales//.json), next-intl (messages/.json), vue-i18n (src/locales/.json), Flutter ARB (lib/l10n/.arb), Android (res/values[-]/strings.xml), iOS (.lproj/Localizable.strings), gettext (locale//LC_MESSAGES/*.po), XLIFF (.xliff/.xlf), Java/Spring .properties, .NET RESX, plus plain .json/.yaml/.csv files anywhere else. Skips node_modules, .git, build/dist output and other noise; bounded so it's safe on large repos.
Args: path: directory to scan (default: current directory).
Returns: { "root": "", "locale_files": ["locales/en.json", "locales/de.json", ...], "base_lang": "en", # best guess, or null if none found/ambiguous "target_langs": ["de", "fr"], # languages present other than base_lang "framework": "i18next", # best guess, or null if unrecognized "file_count": 2 }
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | . |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility. It discloses that the tool is 'Purely local — reads the filesystem, makes no API call,' and explains that it 'Skips node_modules, .git, build/dist output and other noise; bounded so it's safe on large repos.' It also clarifies that outputs are 'best guess' or null when ambiguous, providing a clear behavioral model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening statement, usage guidance, supported frameworks, and a return schema. Each section earns its place; no redundant text. Despite its length, it remains focused and informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (supporting many frameworks and scanning a repo), the description covers purpose, use cases, safety, parameters, and return values in detail. The absence of an output schema is compensated by an explicit return JSON structure with field explanations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, 'path', is described as 'directory to scan (default: current directory).' This adds semantic meaning beyond the schema, which lacks any description. For a single simple parameter, this is fully sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Discover a repo's i18n setup' and lists the exact outputs (locale files, base language, target languages, framework). It distinguishes itself from siblings by positioning itself as the initial discovery step, explicitly naming tools like kaeris_status and kaeris_add_language as subsequent steps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use this FIRST when asked to "look at/audit/fix this repo's i18n" and you don't already know the source file.' It also provides an exclusion condition and points to specific alternative tools, giving strong guidance for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kaeris_statusA
Completeness/health check for every target locale against a source file — the "i18n firewall". Works for EVERY supported format: JSON is checked fully offline; other formats (.arb/.strings/.po/.xml/.ftl/…) are parsed by the backend /api/parse endpoint (no translation, no cost).
For each target language reports missing keys, extra/stale keys, and placeholder mismatches (e.g. "Hello {name}" -> "Bonjour" loses {name}, or "{name}" -> "{nom}" which crashes str.format()/ICU at runtime). Use this to find out what's broken before deciding whether to call kaeris_list_missing_keys (existing locale, some keys missing/broken) or kaeris_add_language (locale doesn't exist yet at all).
Args: source: path to the base-language locale file, e.g. "locales/en.json" or "lib/l10n/app_en.arb" (typically kaeris_scan_repo's base_lang file). langs: target language codes to check, e.g. ["de", "fr"]. If omitted, falls back to kaeris.json's "langs" if present, else auto-discovers sibling files next to the source. out: directory containing the target locale files (default: source's own directory; each target is expected at "/", e.g. de.json for en.json, de.arb for en.arb).
Returns: { "ok": bool, "missing": {lang: [keys]}, "extra": {lang: [keys]}, "placeholder_issues": [{"lang","key","missing","added"}, ...], "missing_files": [lang, ...], # target language has no locale file at all "source", "out_dir", "langs" }
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | ||
| langs | No | ||
| source | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so excellently. It discloses that JSON is checked fully offline while other formats hit the /api/parse endpoint, that there is no translation or cost, and details the exact outputs: missing keys, extra/stale keys, placeholder mismatches, and missing files. This provides a complete behavioral profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely packed with valuable information, structured logically from summary to format handling to usage guidance to args to return value. Every sentence serves a purpose, and the lead sentence immediately clarifies the tool's role. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the absence of an output schema, the description covers all necessary context: supported formats, offline vs. backend behavior, parameter defaults, expected file layout, and a detailed return object. An agent could confidently select and invoke this tool without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates richly. It defines source with concrete examples, explains langs as target codes with fallback to kaeris.json or auto-discovery, and details the out directory with default behavior and expected file naming. This adds far more meaning than the sparse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb (completeness/health check) and resource (every target locale against a source file). It explicitly distinguishes itself as the 'i18n firewall' and contrasts with sibling tools like kaeris_list_missing_keys and kaeris_add_language, making its unique purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use this to find out what's broken before deciding whether to call kaeris_list_missing_keys... or kaeris_add_language.' It also explains fallback behavior for langs and format coverage, giving clear context and alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kaeris_translateA
Translate a set of UI strings into one or more languages.
Format-aware and placeholder-safe: values like "Hello, {name}" keep their placeholders intact. Non-string values are passed through unchanged.
Includes Translation QA so you can trust the output: it flags translations that dropped a placeholder or that grew long enough to risk overflowing the UI. With verify=True it also back-translates each result into back_lang so you can check the meaning is right even in a language you can't read.
Args: strings: key → source-text pairs, e.g. {"greeting": "Hello", "save": "Save"}. target_languages: language codes from kaeris_list_languages, e.g. ["es", "fr", "ja"]. keep: optional list of terms to NEVER translate — kept verbatim in every language (brand/product names), e.g. ["KAERIS", "GitHub"]. context: one line about what the app IS, e.g. "a mobile bank for teenagers" or "a wildlife documentary app". The model uses it to pick the right sense of ambiguous strings — "Bank" becomes Ufer in the second and Bank in the first. You are reading the repo, so you know this: pass it. Max 300 chars. verify: back-translate each result into back_lang to confirm meaning (uses more tokens). back_lang: language for the verify back-translation (default "en"). tone: "formal" or "casual" to steer register; "" (default) is neutral. icu: True if values may contain ICU MessageFormat (plurals/select) so the model preserves the syntax instead of translating it. reuse: optional {lang: {key: previous_translation}} translation-memory map — strings that are unchanged from a prior run are reused verbatim server-side and only new/changed strings are actually translated. api_key: optional KAERIS key (else uses the free tier or KAERIS_API_KEY env). openrouter_key: optional OpenRouter key for Lifetime/BYOK.
Returns: { "translations": { "": { "": "", ... }, ... }, "placeholder_warnings": { "": { "": ["{name}", ...] } }, # if any placeholders were lost "overflow_warnings": { "": [ {"key","src","tr","pct"}, ... ] }, # if UI-overflow risk "back_translations": { "": { "": "" } }, # only if verify=True "failed_languages": [...] # present only if some languages could not be translated }
| Name | Required | Description | Default |
|---|---|---|---|
| icu | No | ||
| keep | No | ||
| tone | No | ||
| reuse | No | ||
| verify | No | ||
| api_key | No | ||
| context | No | ||
| strings | Yes | ||
| back_lang | No | en | |
| openrouter_key | No | ||
| target_languages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so excellently. It discloses placeholder-safe handling, pass-through of non-strings, Translation QA with placeholder and overflow warnings, back-translation behavior, translation-memory reuse, and API key fallback logic. It even explains token cost for verify=True.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although lengthy, the description is meticulously structured: a concise opening, a brief feature-highlight paragraph, a linear Args breakdown with one parameter per line, and a clear Returns block. Every sentence adds necessary information and no words are wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, nested objects, no output schema, and no annotations, the description is remarkably complete. It explains all parameters, return fields, edge cases (failed_languages), and even provides a direct instruction to the agent ('You are reading the repo, so you know this: pass it.'). It leaves virtually no ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the Arduino-style Args section provides thorough explanations for all 11 parameters, including types, examples, defaults, and nuanced semantics (e.g., what 'context' is for, how 'reuse' works, how 'icu' affects processing). This fully compensates for the sparse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Translate a set of UI strings into one or more languages.' It clearly distinguishes from sibling tools like kaeris_translate_file by specifying it operates on a set of key-value pairs rather than a file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates when to use this tool (when you have a set of UI strings) and even references kaeris_list_languages for valid language codes. However, it does not explicitly exclude alternatives like kaeris_translate_file or provide explicit when-not-to-use guidance, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kaeris_translate_fileA
Translate a strings file on disk and write the results next to it.
Supports JSON, YAML, .strings, .po, ARB, Android XML, CSV, XLIFF 1.2, Java/Spring .properties, .NET RESX and Mozilla Fluent (.ftl). With only_new=True (JSON), translates just the keys missing from existing target files and merges.
Args: file_path: path to the source file, e.g. "locales/en.json". target_languages: language codes, e.g. ["de", "uk", "zh"]. out_dir: where to write outputs (default: the source file's directory). only_new: reproducible incremental mode — translate only new AND edited keys, tracked via kaeris.lock (a tone/ICU/glossary change re-translates all); unchanged stays stable. JSON only. keep: optional list of terms to NEVER translate — kept verbatim in every language (brand/product names), e.g. ["KAERIS", "GitHub"]. context: one line about what the app IS, e.g. "a mobile bank for teenagers" or "a wildlife documentary app". The model uses it to pick the right sense of ambiguous strings — "Bank" becomes Ufer in the second and Bank in the first. You are reading the repo, so you know this: pass it. Max 300 chars. verify: back-translate each result into back_lang to confirm meaning (non-incremental only). back_lang: language for the verify back-translation (default "en"). tone: "formal" or "casual" to steer register; "" (default) is neutral. icu: True if values may contain ICU MessageFormat (plurals/select) so the model preserves the syntax instead of translating it. reuse: optional {lang: {key: previous_translation}} translation-memory map — strings unchanged from a prior run are reused verbatim server-side (non-incremental only; only_new does its own client-side diffing). api_key / openrouter_key: optional auth overrides.
Returns: { "written": ["locales/de.json", ...], "languages": [...] }
| Name | Required | Description | Default |
|---|---|---|---|
| icu | No | ||
| keep | No | ||
| tone | No | ||
| reuse | No | ||
| verify | No | ||
| api_key | No | ||
| context | No | ||
| out_dir | No | ||
| only_new | No | ||
| back_lang | No | en | |
| file_path | Yes | ||
| openrouter_key | No | ||
| target_languages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses side effects (file writes, merging), the lock-file mechanism, conditions for retranslation, and the return value. It even explains how context affects translation sense with concrete examples, going far beyond a typical definition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, it is structured with an Args/Returns layout and front-loaded with purpose and supported formats. Every sentence contributes necessary information; there is no fluff or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 13-parameter tool with no annotations and no output schema, this description covers everything: return values, file formats, mode constraints, parameter semantics, and example usage. It is fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description compensates fully by explaining every one of the 13 parameters with examples, defaults, constraints, and interactions (e.g., context max 300 chars, only_new JSON-only, reuse non-incremental).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Translate a strings file on disk and write the results next to it.' It further clarifies scope by listing supported formats, and distinguishes itself from siblings by focusing on file-based translation with incremental options.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear conditions are given: only_new is JSON-only and incremental, verify and reuse are non-incremental-only. While it doesn't explicitly name sibling alternatives, it provides strong when-to-use context through these restrictive clauses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
7 tool updates
v0.2.6- First observed
kaeris_add_language - First observed
kaeris_list_languages - First observed
kaeris_list_missing_keys - First observed
kaeris_scan_repo - First observed
kaeris_status - First observed
kaeris_translate - First observed
kaeris_translate_file
TDQS
Each tool targets a distinct i18n workflow stage—discovery (scan_repo), assessment (status), detailed gap analysis (list_missing_keys), file translation (translate_file), ad-hoc translation (translate), and new-locale bootstrapping (add_language). However, translate_file and add_language overlap in full-file translation, and status/list_missing_keys both report missing keys, though the descriptions clarify their intended use.
All tools share the kaeris_ prefix and lowercase underscore style, and most follow a verb_noun pattern (list_languages, scan_repo, translate_file, list_missing_keys, add_language). Two deviations: kaeris_status is a bare noun, and kaeris_translate is a bare verb, breaking the pattern slightly but remaining readable and predictable.
With 7 tools, the server is well-scoped for its translation/i18n purpose. Each tool covers a distinct functional need—listing languages, scanning repos, checking status, listing missing keys, translating strings or files, and adding languages—without unnecessary granularity.
The tool set covers the full translation lifecycle: discovery (scan_repo), health assessment (status), detailed missing-key inspection (list_missing_keys), incremental and full-file translation (translate_file), ad-hoc string translation (translate), and new-locale creation (add_language). Minor features like language deletion or per-key edits are absent but not essential for the stated purpose.
Maintenance
Related MCP Connectors
Localization for AI agents: projects, languages, glossaries and translations from your agent
AI localization for agents: translation, TMS sync, translation memories, glossaries, post-editing.
AI-powered translation for 48 languages with context-aware quality
Localize and render App Store and Google Play screenshots from Claude. 41 languages.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables translation of JSON i18n files to multiple languages using various AI providers (Google Gemini, OpenAI, Ollama/DeepSeek) with intelligent caching and deduplication.295-
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI-powered translation of Django gettext .po files while intelligently preserving variables, HTML tags, URLs, and JavaScript code with validation and automated updates.1-
- AlicenseNot gradedqualityDmaintenanceAI-powered translation management built for AI agents. Automate localization with regional sensitivity and zero TMS overhead. Works with Claude Code, Cursor, VS Code via MCP protocol. Supports JSON, YAML, Markdown, PO and more.13MIT
- AlicenseNot gradedqualityCmaintenanceLocalization as code — push, pull, translate, and extract strings from code with AI. 7 MCP tools for type-safe i18n across 182 languages.1872MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/RaiGanja/kaeris-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server