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 18 tools to read and write keys, translate, 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
The agent writes the feature's new source strings to the branch in one batched call with
upsert_labels– new keys are created, existing ones updated, and the base branch never sees a half-finished change.upsert_labelsupsert_label - Step 3
Translate the missing values
On any plan, the agent translates them itself:
get_missing_translationsreturns each key with an empty target value, and it writes the translations back withupsert_labels. 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_translationsauto_translatetranslation_job_status - Step 4
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 5
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.merge_branchdelete_branch
A create-own token can propose branches – but only its own. It can never read, merge, or delete a branch it did not create, so a leaked token can never roam beyond its base branch and the branches it made. The merge gate is role-bound: merging and deleting require the developer role or higher.
Setup
The server ships as @translatize/mcp with the binary translatize-mcp. Point your client at npx -y @translatize/mcp and pass a token – no global install needed.
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.
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"
}
}
}
}How 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. It can never touch branches 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
Eighteen tools in four 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. The same operations are available over REST – see the Integration API reference.
Project & labels
| Tool | Arguments | What it does |
|---|---|---|
get_project_info | – | Project id/name, configured languages, base branch, token role, branch scope, writable branches, total key count, and per-language completeness %. Call this first. |
list_labels | namespace?, status?, include_values?, branch? | Keys with their status and tags (values too when include_values is true). Values are capped at 300 with a note. |
get_labels | keys[], branch? | The full record (all values, status, tags) for each named key, plus a not_found list. |
search_labels | query, in?, branch? | Case-insensitive substring search over keys, values, or both; returns matches with values, capped at 100. |
upsert_label | key, values?, status?, tags?, branch? | Creates or updates one label; reports whether it was created or updated. |
upsert_labels | labels[], branch? | Batch create/update (chunked automatically); returns { updated, created, failed }. |
Branches
create_branch, merge_branch and delete_branch require a create-own scoped token – create_branch on a fixed token fails with branch_scope_fixed. 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 / deleted keys of the branch vs the base, each with per-language values, plus a summary. |
get_merge_conflicts | branch | Flat per-key/per-language conflicts vs the base; an empty list means it is safe to merge with the default strategy. |
merge_branch | branch, strategy?, conflicts? | Merges a branch you created into the base (overwrite, keep-newer, manual, replace). Does not delete the branch. |
delete_branch | branch | Deletes a branch this token created – cleanup after a merge. |
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: { key, source, missing[] }. Translate these yourself on any plan, then upsert_labels. |
auto_translate | branch?, target_languages?, label_keys?, overwrite_translated? | Starts a platform-AI background job (Professional/Agency, metered against the AI quota), or a no-op when nothing needs work. |
translation_job_status | – | The current/most-recent AI job (status, progress, queue position) plus the AI quota { used, limit, remaining }. |
Review
| Tool | Arguments | What it does |
|---|---|---|
set_labels_status | keys[], status, branch? | Bulk-set the workflow status (draft / review / approved / rejected) of many keys without touching their values. |
review_changes | branch? | A capped (100-key) review packet – added/changed keys with values – plus a platformUrl to open in the web app. Then ask the user. |
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.