Let AI agents manage your translations
The Translatize MCP server gives AI agents – Claude Code, Cursor, Claude Desktop, and any other Model Context Protocol client – direct, branch-scoped access to your translations. It runs over stdio and exposes 28 tools and 2 workflow prompts to read and write keys with context, translate, run QA checks, publish over-the-air releases and manage git-like branches.
The agent workflow
With a create-own token, an agent can take a translation change from start to finish inside the conversation – and never touch main without your say-so.
- Step 1
Ship a feature – on its own branch
You build a feature with your AI agent. Before touching a single string, the agent forks a translation branch off the base with
create_branch. Yourmainbranch stays untouched the whole time.create_branch - Step 2
Add the new keys with context
The agent writes the feature's new source strings to the branch in one batched call with
upsert_labels, each with its context: what the UI element is, a character limit when the layout has one, thepath:lineit came from, anddoNotTranslatefor product names and codes. The base branch never sees a half-finished change.upsert_labelsset_label_context - Step 3
Translate the missing values
On any plan, the agent translates them itself:
get_missing_translationsreturns each key with an empty target value,get_glossaryandfind_translation_memorykeep the wording consistent with what the project already uses, andupsert_labelswrites the result back. On a Professional or Agency plan it can instead hand the work to Translatize's platform AI withauto_translateand watch the job withtranslation_job_status.get_missing_translationsfind_translation_memoryauto_translatetranslation_job_status - Step 4
Run QA until it is clean
The agent calls
run_qa, fixes every error it reports (a rewritten value or repaired placeholders), runs it again, and finishes withcheck_merge_gateto see whether the merge would be refused.run_qaget_qa_issuescheck_merge_gate - Step 5
Mark for review – and ask you
The agent marks the touched keys with
set_labels_status, then callsreview_changesfor a diff and aplatformUrl. It stops and asks: “review here in the chat, or on Translatize?” – and waits for your approval before going any further.set_labels_statusreview_changes - Step 6
You approve – it merges and cleans up
Once you approve, the agent folds the branch into the base with
merge_branch(checkingget_merge_conflictsfirst when needed), then removes the working branch withdelete_branch. The change lands onmainonly after your sign-off – and merging intomainneeds an admin-role token, otherwise you merge in the app.merge_branchdelete_branch
A create-own token works on its base branch and the branches it created, nothing else. It merges and deletes only its own branches, so a leaked token can't reach the rest of the project. Merging and deleting need the developer role or higher, merging into main needs an admin token, and a token can never override a blocking QA merge gate.
Setup
The server ships on npm as @translatize/mcp (version 0.2.0) with the binary translatize-mcp, and is listed in the MCP Registry as com.translatize/mcp. Point your client at npx -y @translatize/mcp and pass a token – no global install needed. It needs Node.js 18.17 or newer.
Claude Code
Register the server once; Claude Code launches it on demand with npx. Drop the -e flag if TRANSLATIZE_API_TOKEN is already exported in your shell. For the server plus ready-made skills, install the Claude Code plugin instead.
claude mcp add translatize -e TRANSLATIZE_API_TOKEN=mcni_xxx -- npx -y @translatize/mcpCursor
Add the server to .cursor/mcp.json in your project (or the global ~/.cursor/mcp.json):
{
"mcpServers": {
"translatize": {
"command": "npx",
"args": ["-y", "@translatize/mcp"],
"env": {
"TRANSLATIZE_API_TOKEN": "mcni_xxx"
}
}
}
}Any MCP client (Claude Desktop, etc.)
The same mcpServers block works for any client that speaks MCP over stdio – for Claude Desktop, put it in claude_desktop_config.json. For a pinned install, run npm i -g @translatize/mcp and set "command": "translatize-mcp" with "args": [].
{
"mcpServers": {
"translatize": {
"command": "npx",
"args": ["-y", "@translatize/mcp"],
"env": {
"TRANSLATIZE_API_TOKEN": "mcni_xxx",
"TRANSLATIZE_API_URL": "https://api.translatize.com/v1"
}
}
}
}Claude Code plugin
The Translatize plugin for Claude Code bundles the MCP server with two skills, so Claude knows when to use the tools without being told. The plugin reads your token from TRANSLATIZE_API_TOKEN in the environment Claude Code runs in, so the token never lives in the plugin. Its directory, claude-plugin, is in the public Translatize/integrations repository. Clone it, export the token and start Claude Code with the plugin:
git clone https://github.com/Translatize/integrations.git
export TRANSLATIZE_API_TOKEN=mcni_xxx
claude --plugin-dir ./integrations/claude-pluginRun /mcp in the session to check that the translatize server is connected. Then ask something like “Localize the checkout page into Latvian and German”.
| Skill | When Claude uses it | What it does |
|---|---|---|
localize-repo | You ask to localize or internationalize an app, add languages, or extract hardcoded strings. | Ten steps: detect the i18n library, find hardcoded strings, propose dotted keys, create a branch, upsert the source labels with context, replace the strings in code, translate, run QA and fix errors, check the merge gate, then summarise. It never merges into main without your approval. |
translatize-strings | Any time Claude adds or changes user-visible text. | The day-to-day rules: no hardcoded UI strings, keys created through the MCP server with a description (and a character limit when the UI has one), dotted key names, work on a branch, QA before merge. |
Other coding agents can follow the same rules from your repository. This CLI command writes them into a marked section of AGENTS.md (and CLAUDE.md, when it exists):
npx @translatize/cli init --agentsHow it works
Every token is bound to one project and one base branch, and carries a branch scope. Call get_project_info (or list_branches) to see the base branch, the scope, and which branches the token may write to.
Branch scope
fixed (the default) – the token can only read and write its one base branch. create-own – the token may additionally create branches (always forked from the base), read/write/export the branches it created, and compare, merge, and delete those back into the base. Apart from its base branch, it can never touch a branch it did not create. The label and translation tools take an optional branch argument naming any branch in that allowed set; omit it to act on the base branch, and naming a branch outside the set fails with branch_not_allowed.
Environment variables
| Variable | Required | Description |
|---|---|---|
TRANSLATIZE_API_TOKEN | yes | The mcni_... integration token. The server exits immediately if it is missing. |
TRANSLATIZE_API_URL | no | API base URL including the /v1 segment. Defaults to https://api.translatize.com/v1. |
TRANSLATIZE_APP_URL | no | Web-app base used to build the platformUrl review link returned by review_changes. Defaults to https://app.translatize.com. |
Tool catalog
Twenty-eight tools in seven groups. Every label and translation tool accepts an optional branch argument (default: the token's base branch). When a call fails, the tool returns the API error code and a short remedy, so the agent can react without the session breaking. merge_branch, delete_branch and publish_release are marked as destructive, so clients that confirm risky calls will ask you first. The same operations are available over REST – see the Integration API reference.
Project & labels
| Tool | Arguments | What it does |
|---|---|---|
get_project_info | – | Project name and id, its languages and source language, the token's base branch, role and branch scope, the branches it may write to, the key count and completeness per language. Call this first. |
list_labels | namespace?, status?, include_values?, branch? | Keys with their status and tags, filtered by a dotted namespace prefix or status. With include_values, the values too – the first 300, with a note when there are more. |
get_labels | keys[], branch? | The full record (all values, status, tags) of each named key, plus a not_found list. |
search_labels | query, in?, branch? | Case-insensitive substring search over keys, values or both (the default); up to 100 matches with their values. |
upsert_label | key, values?, status?, tags?, context?, branch? | Creates or updates one label and says which. context is { description?, charLimit?, location?, doNotTranslate? }; tags and context need the developer role. |
upsert_labels | labels[], branch? | Batch create or update, split into API-sized chunks automatically; each item may carry tags and context. Returns { updated, created, failed }. |
set_label_context | labels[] ({ key, description?, charLimit?, location?, doNotTranslate?, tags? }), branch? | Sets context and tags on existing keys without touching their values (developer role). A missing key fails with label_not_found. |
Glossary & translation memory
Both are project-wide, so neither tool takes a branch. See Translation memory.
| Tool | Arguments | What it does |
|---|---|---|
get_glossary | – | Project and workspace glossary terms: the required translation per language, case sensitivity and prohibited terms. |
find_translation_memory | texts[], target_lang, source_lang?, threshold? | Up to 3 earlier approved or human-edited translations per text, with match score and quality, placeholders mapped to your text. Up to 500 texts; source_lang defaults to the project's source language. |
Translation
| Tool | Arguments | What it does |
|---|---|---|
translation_status | branch? | Per language: total keys, translated, missing, and up to 50 example missing keys. |
get_missing_translations | branch?, languages?, limit? | Keys with an empty target value as { key, source, missing[] }, 200 rows by default. Translate these yourself on any plan, then upsert_labels. |
auto_translate | branch?, target_languages?, label_keys?, overwrite_translated? | Starts a platform-AI job from the project's source language (Professional and Agency, metered against the AI allowance), or reports that nothing needs work. See AI translation. |
translation_job_status | – | The current or most recent AI job (status, progress, its place in line while queued) plus the AI allowance { used, limit, remaining }. |
Quality
The checks and the merge gate are explained in Quality checks.
| Tool | Arguments | What it does |
|---|---|---|
run_qa | branch?, keys? | Runs the 10 rule checks now (placeholders, HTML tags, ICU syntax and plural categories, glossary, length, numbers, punctuation, untranslated, whitespace): counts per severity, the issues and what to do next. Changes no translation. |
get_qa_issues | branch?, severity?, key?, lang?, source?, cursor?, limit? | One page of stored issues with counts; source "ai" lists AI review findings. |
check_merge_gate | branch, strategy? | Previews the merge gate for that branch and strategy: mode, whether it applies, blocked, errors and warnings with the issues, plus a verdict. |
start_ai_review | branch?, keys?, langs? | Queues a platform AI review (Professional and Agency, own monthly allowance, developer role). Findings never block a merge. |
ai_review_status | – | The latest AI review job: status, branch, progress counts and characters billed. |
Branches
create_branch needs a create-own token (a fixed one fails with branch_scope_fixed), and merge_branch and delete_branch work only on branches the token created. list_branches, compare_with_base and get_merge_conflicts work with any token.
| Tool | Arguments | What it does |
|---|---|---|
list_branches | – | Every branch with writable and createdByThisToken flags, plus baseBranch and branchScope. |
create_branch | name, description? | Forks a new branch from the base. Needs the developer role. Name: ^[a-zA-Z0-9_-]+$, 1–100 chars, not "main". |
compare_with_base | branch | Changed, added and deleted keys of the branch against the base, each with per-language values, plus a summary. |
get_merge_conflicts | branch | Flat per-key, per-language conflicts against the base; an empty list means it is safe to merge with the default strategy. |
merge_branch | branch, strategy?, conflicts? | Merges a branch the token created into the base with overwrite (default), keep-newer, manual, branch-changes or replace (destructive), and keeps the branch. Into main it needs an admin-role token (admin_token_required_for_main), and a blocking QA gate refuses it (qa_gate_blocked) – a token can never override the gate. The strategies are described in the Integration API reference. |
delete_branch | branch | Deletes a branch this token created – cleanup after a merge. |
Review
| Tool | Arguments | What it does |
|---|---|---|
set_labels_status | keys[], status, branch? | Sets the workflow status (draft, review, approved or rejected) of many keys without touching their values. |
review_changes | branch? | A review packet – up to 100 added or changed keys with new and previous values, plus the deleted keys – and a platformUrl to open in the web app. Then the agent asks you. |
Delivery (OTA)
Over-the-air delivery is an add-on, and anything you publish is public. See Delivery (CDN).
| Tool | Arguments | What it does |
|---|---|---|
list_distributions | – | Distributions on branches this token may use: branch, format, all or approved-only, status, latest version and manifest URL. |
publish_release | distribution_id, confirm | Publishes the distribution's branch to the CDN (developer role). Does nothing unless confirm is true; the agent calls it only when you asked to publish. |
Workflow prompts
Two prompts package the whole workflow. In Claude Code they appear as /mcp__translatize__localize_repo and /mcp__translatize__prepare_branch_for_merge.
| Prompt | Arguments | What it does |
|---|---|---|
localize_repo | target_languages, path? | The full localization workflow, the same ten steps as the localize-repo skill: detect the i18n library, find hardcoded strings, propose dotted keys, branch, upsert source labels with context, replace the strings in code, translate, run QA and fix errors, check the merge gate, then summarise – never merging into main without approval. |
prepare_branch_for_merge | branch | Runs QA on the branch, fixes the errors, reports the merge gate and the changes – without merging. |
main needs admin) and the agent-workflow (create-own) branch scope – that is what lets it create, review, and merge its own branches. A fixed-scope token skips the branching steps and works directly on its one bound branch.