MCP server

Localize from inside your AI assistant.

Connect Claude, ChatGPT, Claude Code, Cursor, VS Code or Codex to your string catalog. Your assistant adds keys, sees what each language still lacks, writes or drafts every value against your glossary, checks its work with the editor's own checks and pulls the files, with exactly the permissions you give it: the scopes you approve at sign-in, or the scopes of the token.

Claude Code
claude mcp add --transport http anylocale https://anylocale.com/api/loc/mcp

What you get

Your assistant localizes, you still verify.

  • The tools are the API

    Every tool is a call to the HTTP API, behind the same scope, plan and project checks. An assistant can do nothing over MCP that a script with the same token could not.

    The HTTP API
  • The scopes decide the tools

    A connection with read alone is offered read tools only, so an assistant never sees a write it would be refused. Approve push to write values and manage to change keys, at sign-in or on the token.

  • Nothing goes over the air unverified

    Values an assistant writes or drafts land unverified. draft_translations never touches a verified value; set_translations and push_file can replace one, which demotes it until a person verifies it again. Over-the-air delivery only serves verified strings, so a person signs off before an update reaches a running app.

    Over-the-air delivery
  • One URL, nothing to install

    The server runs on anylocale. Your client needs the URL and either a sign-in or a token, not a local process or a package to keep up to date.

In practice

One prompt, a finished screen.

The assistant checks which locales the project has, creates each key with its length limit, and writes the source text and every translation. You open the editor to a row of unverified strings, ready to check.

  1. > Add keys for the new onboarding screen, 30 characters max, and write German and French.

  2. list_localesmy-app→ en (source), de, fr

  3. create_keyonboarding.title maxLength=30→ created

  4. create_keyonboarding.subtitle maxLength=30→ created

  5. create_keyonboarding.cta maxLength=30→ created

  6. set_translationsonboarding.title en de fr→ written 3

  7. set_translationsonboarding.subtitle en de fr→ written 3

  8. set_translationsonboarding.cta en de fr→ written 3

  9. Created 3 keys and wrote 9 values. They are unverified until you verify them in the editor.

Tools

20 tools, 3 scopes.

readRead the catalog and export files.

  • list_projects

    Use this first: it lists the localization projects this connection can access and gives the project slug every other tool takes. Returns each project's slug, name, source locale, target locales and editor URL.

  • list_locales

    Use this to learn a project's locale codes before reading or writing translations. Returns every locale with the source locale marked, plus the project's iOS string tables.

  • list_keys

    Use this to see a project's whole key set and its naming conventions. Returns every key with its string table, plural flag, tags, description and length limit, but no translations.

  • get_translations

    Use this to read one key's stored values in every locale, source locale first. Each value carries its state (untranslated, translated or verified) and, for plural keys, its CLDR category.

  • pull_file

    Use this to export one locale as a complete string file (xcstrings, android-xml, json, csv, strings, stringsdict, next-intl), exactly as the CLI writes it to disk. Returns the file's text, which can be large for a big catalog.

  • search

    Use this to find string keys by free text when the exact key name is unknown. Matches key names, descriptions and source-language text, case-insensitively, across every project this connection can see. Returns up to 20 results, each with an id, title (the key name), text (its source text) and url (the key in the web editor); pass an id to fetch for the full record.

  • fetch

    Use this to read one search result in full. Takes the id a search result returned and returns the key's description, string table, length limit, plural flag, tags, source locale and every translation with its state, as text and as metadata.

  • get_coverage

    Use this to answer how much of a project is translated. Returns the total number of translatable keys and, per target locale, how many keys are untranslated, translated (drafted but unreviewed) and verified, with the verified share as a percentage. A plural key counts once and is untranslated until every form the locale needs has text. Call list_missing for the keys behind a number.

  • list_missing

    Use this to see what is left to do in one locale: every key that is not yet verified there, with its description, length limit, plural flag, source text, current value and state. Untranslated keys have no usable text yet; translated ones have a draft awaiting review. Pass state to narrow to one of those. Pages of 50 keys by default (at most 200); pass nextCursor back as cursor until it is null. Write the missing values with set_translations.

  • list_glossary

    Consult this before translating or writing any value: it returns the project's glossary, the binding term base every translation must follow. A term marked doNotTranslate is kept exactly as written in every locale (brand and product names); a term with a translation must be rendered with that wording, and its note explains when. Pass a locale to get only the terms that bind it (project-wide terms plus that locale's own). Prefer glossary wording over your own whenever a term occurs in the source text.

  • check_translations

    Use this before set_translations to validate hand-written values without writing anything. Runs the editor's five checks against the proposed values: placeholders match the source text, the value fits the key's length limit, glossary terms are honoured, the value is consistent with sibling keys sharing the same source text, and the value is not empty. Takes the same values shape as set_translations and returns the issues per locale (check type and message); an empty list means the value would pass.

  • list_activity

    Use this to see who changed which translations recently: the 20 latest events by default, newest first, each with the key, locale, whether the value was translated or verified, when, and the actor (a person's name or an API token's name; values written by a token or an assistant are unverified drafts). To page further back, call again with cursor set to the nextCursor of the previous page, and stop when nextCursor is null.

pushWrite values and upload source files.

  • set_translations

    Use this to write one key's value in one or more locales; the key must already exist. A plural key takes an object of the locale's CLDR categories instead of a string. Written values are stored as unverified drafts until a person verifies them in the editor, and writing the source locale demotes verified targets. Returns the cells written.

  • push_file

    Use this to upload a whole string file and upsert every key in it, creating keys that do not exist yet. Additive: keys missing from the file are left in place. Without a locale the file is taken as the source locale. Returns counts of keys created and updated.

  • draft_translations

    Use this to have the product's own AI draft one key's translations, using the project's glossary, translation memory and the key's length limit. Without locales it drafts every target locale still missing a value; named locales are redrafted unless verified (verified values are never replaced). Drafts are written as unverified, AI-marked values a person must verify in the editor. Returns what was drafted per locale and which locales were skipped and why. Spends model calls, so pass at most 20 locales and do not call it in a loop.

manageCreate, edit and delete keys.

  • create_key

    Use this to add one new key with its metadata: a description for translators, a length limit, the plural flag, its iOS string table and tags. Fails if the name already exists. Returns the new key's id and name; it has no values until translations are set.

  • update_key

    Use this to change an existing key's metadata. Omitted fields keep their value. tags replaces the whole set and cannot be combined with addTags or removeTags. Returns the key's id and name.

  • delete_keydestructive

    Use this only when the user has explicitly asked to delete this key: it removes the key and every translation of it, permanently. Returns the deleted key's name.

  • add_glossary_term

    Use this to record a term every later translation must respect: either a do-not-translate rule (doNotTranslate true, no translation needed) or a required wording (translation set). Without a locale the term binds every locale of the project; with one it is that locale's preferred wording. Fails with a conflict if the term already exists in that scope. Returns the new term's id. Adding a term changes future translations and the terminology check, never stored values.

  • delete_glossary_termdestructive

    Use this only when the user has explicitly asked to remove a glossary term: later translations stop being bound by it, permanently. Takes the term's id or its source term; a source term that exists in several scopes needs a locale (or the id) to pick one. Returns the deleted term.

Set it up

Connected in a minute.

  1. Step 1: Sign in, or issue a token

    Claude, ChatGPT, Claude Code and Codex sign in: they send you to anylocale, where you pick one project and approve the scopes, and there is no token to copy. Connecting takes the same role as issuing a token: an organization admin, or an approver on the project. Cursor and VS Code take a token, issued per project under Settings, Integrations, and so does any client in CI or a headless run. Start with read; add push and manage when the assistant should write. Export it as ANYLOCALE_TOKEN; VS Code asks for it instead.

  2. Step 2: Connect your client

    The server speaks MCP over Streamable HTTP at https://anylocale.com/api/loc/mcp. Claude, ChatGPT, Claude Code and Codex sign in with OAuth; Cursor and VS Code send a token as a bearer header.

    In claude.ai or Claude Desktop, open Customize, Connectors, choose Add custom connector and paste the URL. Claude opens anylocale to sign in, pick a project and approve the scopes. In a Team or Enterprise organization an Owner adds the connector under Organization settings, Connectors, and members connect to it from there.

    Remote MCP server URL
    https://anylocale.com/api/loc/mcp
  3. Step 3: Try a prompt

    With all three scopes approved, ask: "Add keys for the new onboarding screen, 30 characters max, and write German and French." The assistant creates the keys and writes every value, and each one waits unverified in the editor for a person to check. It can also report what a locale still lacks, keep to your glossary, have anylocale's own AI draft the gaps, and run the editor's placeholder, length and terminology checks before it writes.

Example prompts

  • Add keys for the new onboarding screen, 30 characters max, and write German and French.

  • Which keys in my-app still have no French translation?

  • Draft the missing Spanish values with anylocale's AI, then check them against the glossary and length limits.

  • Shorten every German value that is over its length limit, keeping the meaning.

  • Pull the German strings.xml for the Android build.

Good to know

  • An OAuth connection covers one project. Connect again to reach another.
  • An OAuth access token lasts 1 hour; the refresh token behind it is rotated on every use and lasts 30 days. An API token has no expiry until it is revoked.
  • Custom connectors in a Claude Team or Enterprise organization are added by an Owner. Developer mode in a ChatGPT workspace is under the admin's control.
  • A file pushed through push_file has the same 24MB cap as the push endpoint.
  • draft_translations drafts one key per call, at most 20 locales at a time, and never replaces a verified value.

Questions

Should I use the MCP server or the CLI?
The CLI suits builds and CI, where a script writes files to disk. The MCP server suits an assistant working with you: it reads keys and writes values as tool calls instead of parsing command output.The CLI
Does it work with claude.ai or ChatGPT?
Yes. Both connect with OAuth: add the server URL, sign in to anylocale, pick one project and approve the scopes. Claude Code and Codex sign in the same way; Cursor and VS Code send an API token as a bearer header. Neither directory lists the server yet, so it is added by URL as a custom connector.
What can a connection reach?
One project, with the scopes you approved at sign-in, until you revoke it. The access token lasts 1 hour and is renewed with a refresh token that is replaced on every use and expires after 30 days without one. A second project is a second connection.
How do I disconnect an assistant?
Remove the connector in the client, or revoke the connection under the project's Settings, Integrations, where every connected app is listed next to the API tokens. Revoking deletes the connection's access tokens with it, so access stops at once. The person who connected the app, an organization admin or a project approver can revoke it. A token is revoked on the same page.
Can an assistant publish strings to my users?
Not over the air. There is no publish tool: releasing over the air stays in the editor, and only serves strings a person has verified. A file pulled for a build carries the current text of every key, verified or not, exactly as a pull from the CLI does.
Can a connection reach another project?
No. A connection or a token issued for one project is refused on every other one, and none reaches another organization's projects. The check is the API's own, not the MCP layer's.
Who wrote a value?
Values written with set_translations, push_file or draft_translations carry the writer's name in the activity feed: the token's name, or the connected app's name marked OAuth. Give each assistant its own token or connection. Key and glossary changes are not attributed yet.
Does it need a particular plan?
No. Every plan includes every tool. An organization without an active subscription is refused, the same as on the CLI.

Start with the file your app already ships.

After checkout, import one strings file and read the first drafts within minutes.

The MCP server is included in every plan. Connecting a client takes a sign-in or one token.