Crowdin MCP by usefulapi

MCP server for Crowdin — projects, files, strings, translation progress, tasks, and members.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
98%
Naming quality
78%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'crowdin_list_supported_languages' name length outside 3-30 rangein crowdin_list_supported_languages

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,539Tokens (tool definitions)
~1.8 KBTypical response size
Moderate attention impact (1.98% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "crowdin": {
      "url": "https://crowdin.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://crowdin.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (12)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢crowdin_list_projects(limit, offset, groupId, hasManagerAccess)

List projects the token can access (id, name, sourceLanguageId, targetLanguageIds). Good first call to discover project ids. Crowdin API: GET /projects.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Max rows (max 500, default 25).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 500
    },
    "offset": {
      "description": "Rows to skip (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "groupId": {
      "description": "Filter by group id (Enterprise).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "hasManagerAccess": {
      "description": "1 = only projects where you are a manager.",
      "anyOf": [
        {
          "type": "number",
          "const": 0
        },
        {
          "type": "number",
          "const": 1
        }
      ]
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢crowdin_get_project(projectId)

Get a single project's details by id (settings, languages, counts). Crowdin API: GET /projects/{projectId}.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Numeric project id (from crowdin_list_projects)."
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢crowdin_list_files(projectId, limit, offset, branchId, directoryId, ...)

List source files in a project (id, name, path, type, status). Crowdin API: GET /projects/{projectId}/files.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Numeric project id."
    },
    "limit": {
      "description": "Max rows (max 500, default 25).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 500
    },
    "offset": {
      "description": "Rows to skip (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "branchId": {
      "description": "Filter by branch id.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "directoryId": {
      "description": "Filter by directory id.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "filter": {
      "description": "Filter files by name substring.",
      "type": "string"
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢crowdin_list_branches(projectId, limit, offset, name)

List version branches in a project (id, name, title). Crowdin API: GET /projects/{projectId}/branches.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Numeric project id."
    },
    "limit": {
      "description": "Max rows (max 500, default 25).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 500
    },
    "offset": {
      "description": "Rows to skip (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "name": {
      "description": "Filter by branch name.",
      "type": "string"
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢crowdin_list_directories(projectId, limit, offset, branchId, directoryId)

List directories (folders) in a project (id, name, path). Crowdin API: GET /projects/{projectId}/directories.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Numeric project id."
    },
    "limit": {
      "description": "Max rows (max 500, default 25).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 500
    },
    "offset": {
      "description": "Rows to skip (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "branchId": {
      "description": "Filter by branch id.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "directoryId": {
      "description": "Filter by parent directory id.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢crowdin_list_strings(projectId, limit, offset, fileId, branchId, ...)

List source strings in a project (id, text, identifier, context). Crowdin API: GET /projects/{projectId}/strings.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Numeric project id."
    },
    "limit": {
      "description": "Max rows (max 500, default 25).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 500
    },
    "offset": {
      "description": "Rows to skip (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "fileId": {
      "description": "Filter by source file id.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "branchId": {
      "description": "Filter by branch id.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "croql": {
      "description": "Crowdin Query Language filter, e.g. count of words <= 5.",
      "type": "string"
    },
    "filter": {
      "description": "Filter strings by text or identifier substring.",
      "type": "string"
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢crowdin_get_language_progress(projectId, limit, offset)

Per-target-language translation & approval completion percentages for a project — the headline localization status. Crowdin API: GET /projects/{projectId}/languages/progress.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Numeric project id."
    },
    "limit": {
      "description": "Max rows (max 500, default 25).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 500
    },
    "offset": {
      "description": "Rows to skip (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢crowdin_list_tasks(projectId, limit, offset, status, assigneeId)

List translation/proofreading tasks in a project (id, title, status, assignees). Crowdin API: GET /projects/{projectId}/tasks.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Numeric project id."
    },
    "limit": {
      "description": "Max rows (max 500, default 25).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 500
    },
    "offset": {
      "description": "Rows to skip (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "status": {
      "description": "Filter by task status.",
      "type": "string",
      "enum": [
        "todo",
        "in_progress",
        "done",
        "closed"
      ]
    },
    "assigneeId": {
      "description": "Filter by assignee user id.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢crowdin_list_members(projectId, limit, offset, search)

List members of a project (id, username, role, permissions). Crowdin API: GET /projects/{projectId}/members.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Numeric project id."
    },
    "limit": {
      "description": "Max rows (max 500, default 25).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 500
    },
    "offset": {
      "description": "Rows to skip (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "search": {
      "description": "Search members by name/username/email.",
      "type": "string"
    }
  },
  "required": [
    "projectId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢crowdin_list_supported_languages(limit, offset)

Crowdin's catalog of supported languages (id, name, locale, twoLettersCode). Crowdin API: GET /languages.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Max rows (max 500, default 25).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 500
    },
    "offset": {
      "description": "Rows to skip (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴crowdin_add_string(projectId, text, fileId, identifier, context, ...)

Adds a source string to a file in a Crowdin project (additive). Crowdin API: POST /projects/{projectId}/strings.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Numeric project id (path)."
    },
    "text": {
      "type": "string",
      "description": "The source string text."
    },
    "fileId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Id of the source file to add the string to."
    },
    "identifier": {
      "description": "Optional unique string identifier / key.",
      "type": "string"
    },
    "context": {
      "description": "Optional context shown to translators.",
      "type": "string"
    },
    "isHidden": {
      "description": "Hide the string from translators.",
      "type": "boolean"
    },
    "maxLength": {
      "description": "Max allowed translation length.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "projectId",
    "text",
    "fileId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴crowdin_add_translation(projectId, stringId, languageId, text, pluralCategoryName)

Adds a translation for a source string in a target language (additive). Crowdin API: POST /projects/{projectId}/translations.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Numeric project id (path)."
    },
    "stringId": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Id of the source string to translate."
    },
    "languageId": {
      "type": "string",
      "description": "Target language id, e.g. \"fr\", \"de\", \"uk\"."
    },
    "text": {
      "type": "string",
      "description": "The translation text."
    },
    "pluralCategoryName": {
      "description": "Plural form, e.g. \"one\", \"few\", \"many\", \"other\".",
      "type": "string"
    }
  },
  "required": [
    "projectId",
    "stringId",
    "languageId",
    "text"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded12 tools
verifiedversion not recorded12 tools
verifiedversion not recorded12 tools
verifiedversion not recorded12 tools
failed observationversion not recorded—