Skip to content

Weblate MCP by usefulapi

by usefulapi.io · remote · no sign-in to list tools · v1.3.3 · published by io.usefulapi

Read Weblate projects, strings, stats and changes; translate, suggest, comment and autotranslate.

Deletes · 5Changes · 2

23 tools: 5 can delete or cancel things, 2 change things and 16 only read.

Scanned Oct 21, 2026

2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http weblate https://weblate.usefulapi.io/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn1 info
  • The server marks "weblate_list_unit_comments" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "weblate_list_unit_comments" says "list": a word for reading.

    What this check looks for
  • The description mentions "credentials".

    Matched text

    description: "...mponents. Repository URLs have embedded credentials removed. GET /api/components/ or /api/p..."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

23 tools

Deletes or cancels 5Claude Code: deny
  • weblate_accept_suggestionWRITE: apply a suggestion to its string (replaces the current translation).No findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: apply a suggestion to its string (replaces the current translation). `approve` also marks it approved (review workflow and permission needed). Weblate 2026.8+. POST /api/suggestions/{id}/accept/.

    Annotations the server declares

    • title: Accept a suggestion
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • weblate_add_suggestionWRITE: propose a translation for one string; normally a reviewer accepts it later, but the author's automatic upvote (or an existing identical suggestion) can reach the project's a…No findings

    Why it is in this group

    • The name "weblate_add_suggestion" says "add": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: propose a translation for one string; normally a reviewer accepts it later, but the author's automatic upvote (or an existing identical suggestion) can reach the project's auto-accept threshold and apply it at once. Needs the Add suggestion permission and suggestions enabled (Weblate 2026.8+). POST /api/units/{id}/suggestions/.

    Annotations the server declares

    • title: Add a suggestion
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • weblate_autotranslateWRITE: fill a translation automatically from other components (auto_source others, default) or from machine translation (mt, needs engines).No findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: fill a translation automatically from other components (auto_source others, default) or from machine translation (mt, needs engines). `mode` suggest only adds suggestions (default), translate writes translations, fuzzy marks them needing edit. `q` limits it to strings matching a search (default state:<translated, the strings that are not translated yet); threshold is the minimum match score (default 80). Use background to schedule a task instead of waiting. POST /api/translations/{project}/{component}/{language}/autotranslate/.

    Annotations the server declares

    • title: Run automatic translation
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • weblate_repository_operationWRITE: commit (write pending translations into the local repository), pull (merge upstream changes) or push (publish committed changes to the remote repository) for a project or on…No findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: commit (write pending translations into the local repository), pull (merge upstream changes) or push (publish committed changes to the remote repository) for a project or one component. Push changes the remote repository. reset and cleanup are not offered. POST /api/projects/{project}/repository/ or /api/components/{project}/{component}/repository/.

    Annotations the server declares

    • title: Run a repository operation
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • weblate_update_translationWRITE: set the translation of one string (replaces the current target).No findings

    Why it is in this group

    • The name "weblate_update_translation" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: set the translation of one string (replaces the current target). `target` is the list of plural forms. `state` is required (Weblate rejects a partial update without both): 0 untranslated with an empty target, 10 needs editing, 20 translated or 30 approved (approval needs the review workflow and permission). The number of plural forms must match the language. Changes are committed to the repository by Weblate's normal schedule. PATCH /api/units/{id}/.

    Annotations the server declares

    • title: Update a translation
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
Changes things 2Claude Code: ask
  • weblate_add_unit_commentWRITE: add a comment to one string (Markdown, @username mentions notify users).No findings

    Why it is in this group

    • The name "weblate_add_unit_comment" says "add": a word for a change.
    Description, as the server wrote it
    WRITE: add a comment to one string (Markdown, @username mentions notify users). `scope` is global (all languages), translation (this language) or report (a source-string issue report; needs the review workflow). Weblate 5.12+. POST /api/units/{id}/comments/.

    Annotations the server declares

    • title: Add a string comment
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • weblate_list_unit_commentsComments on one string (Weblate 5.15+).1 finding

    Why it is in this group

    • The name "weblate_list_unit_comments" says "list": a word for reading.
    • The description's first verb is "comment": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "weblate_list_unit_comments" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "weblate_list_unit_comments" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Comments on one string (Weblate 5.15+). GET /api/units/{id}/comments/.

    Annotations the server declares

    • title: List string comments
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
Only reads 16Claude Code: allow
  • weblate_get_componentOne component: repository, branch, file mask, template, source language, commit and merge settings, lock state.No findings

    Why it is in this group

    • The name "weblate_get_component" says "get": a word for reading.
    Description, as the server wrote it
    One component: repository, branch, file mask, template, source language, commit and merge settings, lock state. GET /api/components/{project}/{component}/.

    Annotations the server declares

    • title: Get component
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_get_projectOne project by slug: name, website, settings, instructions and links.No findings

    Why it is in this group

    • The name "weblate_get_project" says "get": a word for reading.
    Description, as the server wrote it
    One project by slug: name, website, settings, instructions and links. GET /api/projects/{project}/.

    Annotations the server declares

    • title: Get project
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_get_repository_statusVersion-control status: pending changes to commit, upstream changes to merge, changes to push, remote commit, merge failure.No findings

    Why it is in this group

    • The name "weblate_get_repository_status" says "get": a word for reading.
    Description, as the server wrote it
    Version-control status: pending changes to commit, upstream changes to merge, changes to push, remote commit, merge failure. For a project (summary of all its repositories) or one component. GET /api/projects/{project}/repository/ or /api/components/{project}/{component}/repository/.

    Annotations the server declares

    • title: Get repository status
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_get_statisticsTranslation progress: strings and words total, translated, needing edit, with percentages and checks.No findings

    Why it is in this group

    • The name "weblate_get_statistics" says "get": a word for reading.
    Description, as the server wrote it
    Translation progress: strings and words total, translated, needing edit, with percentages and checks. Scope by project; add a component for per-language statistics of a component, add a language too for one translation. GET /api/projects/{project}/statistics/, /api/components/{project}/{component}/statistics/ or /api/translations/{project}/{component}/{language}/statistics/.

    Annotations the server declares

    • title: Get statistics
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_get_translationOne translation (a component in one language): statistics, language, file name, revision and links.No findings

    Why it is in this group

    • The name "weblate_get_translation" says "get": a word for reading.
    Description, as the server wrote it
    One translation (a component in one language): statistics, language, file name, revision and links. GET /api/translations/{project}/{component}/{language}/.

    Annotations the server declares

    • title: Get translation
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_get_unitOne string by id: source and target forms, state, context, location, flags, labels, explanation, suggestions/comments flags, web link.No findings

    Why it is in this group

    • The name "weblate_get_unit" says "get": a word for reading.
    Description, as the server wrote it
    One string by id: source and target forms, state, context, location, flags, labels, explanation, suggestions/comments flags, web link. GET /api/units/{id}/.

    Annotations the server declares

    • title: Get string
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_list_changesThe activity log: who changed or translated what, when, with the action name and the changed text.No findings

    Why it is in this group

    • The name "weblate_list_changes" says "list": a word for reading.
    Description, as the server wrote it
    The activity log: who changed or translated what, when, with the action name and the changed text. Scope by project, component or translation (language), or filter by user, action id and time range. GET /api/changes/ or the project/component/translation changes endpoint.

    Annotations the server declares

    • title: List changes
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_list_componentsList translation components (one translatable file set in a repository), with repository, file mask, source language and status flags.1 finding

    Why it is in this group

    • The name "weblate_list_components" says "list": a word for reading.

    Findings

    • Info

      The description mentions "credentials".

      Matched text

      description: "...mponents. Repository URLs have embedded credentials removed. GET /api/components/ or /api/p..."

      What this check looks for
    Description, as the server wrote it
    List translation components (one translatable file set in a repository), with repository, file mask, source language and status flags. Give a project to list only its components. Repository URLs have embedded credentials removed. GET /api/components/ or /api/projects/{project}/components/.

    Annotations the server declares

    • title: List components
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_list_languagesList the languages known to this Weblate instance: code, name, text direction, plural forms.No findings

    Why it is in this group

    • The name "weblate_list_languages" says "list": a word for reading.
    Description, as the server wrote it
    List the languages known to this Weblate instance: code, name, text direction, plural forms. GET /api/languages/.

    Annotations the server declares

    • title: List languages
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_list_project_languagesPer-language translation statistics for a whole project (code, total, translated, percentages).No findings

    Why it is in this group

    • The name "weblate_list_project_languages" says "list": a word for reading.
    Description, as the server wrote it
    Per-language translation statistics for a whole project (code, total, translated, percentages). GET /api/projects/{project}/languages/.

    Annotations the server declares

    • title: List project languages
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_list_projectsList the projects visible to this token: name, slug, website and settings (review workflow, access control).No findings

    Why it is in this group

    • The name "weblate_list_projects" says "list": a word for reading.
    Description, as the server wrote it
    List the projects visible to this token: name, slug, website and settings (review workflow, access control). GET /api/projects/.

    Annotations the server declares

    • title: List projects
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_list_suggestionsList suggestions (proposed translations waiting for review), newest first (Weblate 2026.8+).No findings

    Why it is in this group

    • The name "weblate_list_suggestions" says "list": a word for reading.
    Description, as the server wrote it
    List suggestions (proposed translations waiting for review), newest first (Weblate 2026.8+). Give a unit id for one string's suggestions. GET /api/suggestions/ or /api/units/{id}/suggestions/.

    Annotations the server declares

    • title: List suggestions
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_list_translationsList the translations (one language each) of a component with their statistics: total, translated, fuzzy, percent, last change.No findings

    Why it is in this group

    • The name "weblate_list_translations" says "list": a word for reading.
    Description, as the server wrote it
    List the translations (one language each) of a component with their statistics: total, translated, fuzzy, percent, last change. GET /api/components/{project}/{component}/translations/.

    Annotations the server declares

    • title: List translations
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_list_unitsList or search translation strings (units): source, target, state (0 untranslated, 10 needs editing, 20 translated, 30 approved, 100 read-only), context, location, failing checks.No findings

    Why it is in this group

    • The name "weblate_list_units" says "list": a word for reading.
    Description, as the server wrote it
    List or search translation strings (units): source, target, state (0 untranslated, 10 needs editing, 20 translated, 30 approved, 100 read-only), context, location, failing checks. Search with Weblate's query syntax, for example state:<translated or has:suggestion. Give project + component + language to read one translation; without them all visible strings are searched. GET /api/translations/{project}/{component}/{language}/units/ or /api/units/.

    Annotations the server declares

    • title: List strings
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_lookup_memoryFind translation memory matches (exact or fuzzy) for up to 20 source strings in one language pair.No findings

    Why it is in this group

    • The name "weblate_lookup_memory" says "lookup": a word for reading.
    Description, as the server wrote it
    Find translation memory matches (exact or fuzzy) for up to 20 source strings in one language pair. Read-only: nothing is stored. POST /api/memory/lookup/.

    Annotations the server declares

    • title: Look up translation memory
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • weblate_search_memoryBrowse the translation memory entries visible to the token, filtered by source text (substring), languages or project.No findings

    Why it is in this group

    • The name "weblate_search_memory" says "search": a word for reading.
    Description, as the server wrote it
    Browse the translation memory entries visible to the token, filtered by source text (substring), languages or project. GET /api/memory/.

    Annotations the server declares

    • title: Search translation memory
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.3.3. Values in angle brackets are yours to fill in.

claude mcp add --transport http weblate https://weblate.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__weblate__weblate_list_projects",
      "mcp__weblate__weblate_get_project",
      "mcp__weblate__weblate_list_components",
      "mcp__weblate__weblate_get_component",
      "mcp__weblate__weblate_list_translations",
      "mcp__weblate__weblate_get_translation",
      "mcp__weblate__weblate_get_statistics",
      "mcp__weblate__weblate_list_project_languages",
      "mcp__weblate__weblate_list_languages",
      "mcp__weblate__weblate_list_units",
      "mcp__weblate__weblate_get_unit",
      "mcp__weblate__weblate_list_suggestions",
      "mcp__weblate__weblate_list_changes",
      "mcp__weblate__weblate_search_memory",
      "mcp__weblate__weblate_lookup_memory",
      "mcp__weblate__weblate_get_repository_status"
    ],
    "ask": [
      "mcp__weblate__weblate_list_unit_comments",
      "mcp__weblate__weblate_add_unit_comment"
    ],
    "deny": [
      "mcp__weblate__weblate_update_translation",
      "mcp__weblate__weblate_add_suggestion",
      "mcp__weblate__weblate_accept_suggestion",
      "mcp__weblate__weblate_repository_operation",
      "mcp__weblate__weblate_autotranslate"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as weblate. Review it before you use it.