Model Context Protocol server for Verbumia — list projects, missing keys, propose translations from Claude Desktop and other MCP clients.
Project description
Sonenta MCP server
Model Context Protocol server for Sonenta — exposes your translation project to Claude Desktop and other MCP clients.
Status
Tools wired: list_projects, get_project_info, list_keys,
list_untranslated_keys, list_missing_keys, missing_keys_stats,
acknowledge_missing_keys, create_namespace, create_key,
create_keys_bulk, update_key, update_keys_bulk, propose_translation,
propose_translations_bulk, publish_cdn, validate_translations,
project_context_get, project_context_set, glossary_list, glossary_create,
glossary_update, glossary_delete, health_report, coverage_report,
delete_keys_bulk, restore_keys_bulk, list_trash, a11y_estimate,
generate_a11y_variant, translate_a11y_variants, a11y_report,
list_a11y_gaps, set_a11y_variant, delete_a11y_variant.
Project context document (V1.2)
project_context_get / project_context_set read and write a free-form
markdown blob attached to the project — terminology, brand voice, domain
notes (religious, legal, medical, gaming, etc.). The content is intended
as ambient context for human translators and for AI agents producing
translations: prepend it to your translation prompts so every output stays
consistent with the project's vocabulary and tone. Hard cap 100 KiB.
Scopes:
project_context_getrequiresproject:read(existing scope).project_context_setrequiresproject:settings:write(new scope, narrower thanproject:writesince settings changes propagate to every translator's prompt context).
Note: the blanket mcp:* scope is not sufficient for these tools — grant
the precise scope on the key.
Glossary (V1.3)
CRUD over the project glossary — the terminology rules the backend applies when
translating. The single public rule_type vocabulary is translation |
do_not_translate | forbidden (the internal storage type is never exposed).
glossary_list— filtersrule_type,q(substring on term),limit(1..500, default 200) →{ items, total }.glossary_create—{ rule_type?, term, translations?, case_sensitive?, note? };rule_typedefaults totranslation;translationsis honored only fortranslation. 409 on a duplicate(rule_type, term).glossary_update— byentry_id; send only the fields to change (term,translations,case_sensitive,note).rule_typeis immutable.glossary_delete— byentry_id.
These use the dedicated MCP surface /v1/mcp/projects/{id}/glossary and need the
mcp:* scope (the dashboard glossary endpoints are project-role only).
Per-string glossary hints. list_untranslated_keys and list_keys accept
include_glossary_hints: true (default false). When set, each returned key
carries a glossary_hints[] array — { term, rule_type, target_translation, matched_text } — for the rules the backend matched against the key's source
string. All matching is backend-side; the MCP forwards the flag and surfaces the
hints verbatim.
Quality reports + trash (V1.4)
Read-only inspection (surfaced verbatim):
health_report— project source-health report (source-string issues, withby_issue/by_severityrollups). Optionalversion_id.coverage_report— translation-coverage report (global completeness + per-language). Optionalversion_id.
Trash — soft-delete, restorable; no purge over MCP (hard-delete is human-only via the dashboard):
delete_keys_bulk— move up to 500 keys to the trash bykey_uuid(idempotent).restore_keys_bulk— restore trashed keys bykey_uuid.list_trash— list trashed keys ({key_uuid, namespace, name, deleted_at}, cursor-paginated).
The trash tools are uuid-addressed: get key_uuid from list_keys (active)
or list_trash (trashed), then pass it to delete/restore. A trashed key
disappears from list_keys, list_untranslated_keys, the CDN, and the reports
until it is restored.
Edit a key's source value (V1.5)
update_key / update_keys_bulk edit a key's source-language value in place
(PATCH), preserving the key and its history (version bump + history revision +
audit). Address the key by exactly one of key_uuid (preferred — from
list_keys) or namespace + name; an optional description can be updated
in the same call.
- When the
source_valueactually changes, the key'sreviewed/approvedtarget translations are demoted to needs-review (translated, the "à revoir" state);missing/draft/translatedtargets are left untouched.stale_flaggedreports how many were demoted. - Submitting the current value is a no-op (
result: "unchanged", not billed); a real source change — or adescription-only change — bills 1 unit per key. update_keys_bulktakes up to 500 items and returns a per-itemresultsarray (status:ok|unchanged|error) plus asummaryroll-up; valid items commit even if siblings fail.
Accessibility (a11y) variants (a11y V1)
Semantic accessibility variants that extend the variant engine with four
surfaces — aria_label, alt_text, screen_reader, plain_language —
orthogonal to the visible text. All are thin HTTP wrappers surfaced verbatim.
Discover gaps (read-only WCAG report):
a11y_report— per key/surface/locale a11y gaps withby_gap/by_severity/by_surfacerollups + per-item details. Gap types:a11y_untranslated,alt_missing,reading_level_high,a11y_variant_absent. Optionalversion_id,require_surface[](flag surfaces absent in the source), andreading_level_max_words(5..60, default 15).list_a11y_gaps— the actionableitems[]ofa11y_report, filtered client-side bygap/surface/locale. To find keys with no a11y variant, passrequire_surface=<surface>and filtergap=a11y_variant_absent.
AI fill (billed in credits — call a11y_estimate first):
a11y_estimate— preview{units, credit_cost_per_unit, credits_required, balance, sufficient}for agenerateortranslaterun (tierstandard=1 /premium=4 per unit).generate_a11y_variant— AI-generate source-language a11y variants for keys that lack them (aria/screen_reader/plain_language from the visible text, alt_text from the key context). Draft, bot-authored.translate_a11y_variants— translate existing source a11y overrides into the requestedlanguage_codes.
Manual CRUD (one cell at a time):
set_a11y_variant— upsert one override for(key_uuid, language_code, surface)with a textvalue. Address by the locale code ana11y_reportgap already carries — no UUID resolution. Stored as a draft (bot) override.delete_a11y_variant— clear one override; the cell re-inherits the base value.
All a11y tools are reachable with the same mcp:* key as the rest of the MCP
surface — no extra scope. estimate / generate / translate hit
/v1/mcp/projects/{id}/a11y/*; the report hits
/v1/mcp/projects/{id}/a11y-report; set/delete use the code-addressed
/v1/mcp/projects/{id}/keys/{key_uuid}/a11y-variants/{language_code}/{surface}
(the locale code comes straight from an a11y_report item).
Install
# Recommended (zero-install, used by Claude Desktop's mcp.json):
npx -y @sonenta/mcp
# Or from PyPI:
pipx install verbumia-mcp
A Homebrew tap (brew install sonenta/tap/verbumia-mcp) is coming once we
publish to npm.
Configure (Claude Desktop)
Open Settings → Developer → Edit Config, then:
Single-project setup:
{
"mcpServers": {
"sonenta": {
"command": "npx",
"args": ["-y", "@sonenta/mcp"],
"env": {
"SONENTA_API_KEY": "vrb_live_<prefix>.<secret>",
"SONENTA_PROJECTS": "<project_uuid>",
"SONENTA_BASE_URL": "https://api.sonenta.com"
}
}
}
}
Multi-project setup (v0.11+) — comma-separate the UUIDs and Claude will pass
project_uuid on each tool call:
"env": {
"SONENTA_API_KEY": "vrb_live_<prefix>.<secret>",
"SONENTA_PROJECTS": "01993a..,01993b..,01993c.."
}
Restart Claude Desktop. Tools show up in the prompt UI.
Environment
| Variable | Required | Default | Description |
|---|---|---|---|
SONENTA_API_KEY |
yes | API key from Org Settings → API Keys (SONENTA_TOKEN also accepted, back-compat) |
|
SONENTA_PROJECTS |
no | (LLM passes per call) | CSV of project UUIDs. When >1, the LLM MUST pass project_uuid on each tool call. |
SONENTA_PROJECT |
no | (legacy) | Singular fallback for v0.10.x users. Ignored when SONENTA_PROJECTS is set (warns). |
SONENTA_BASE_URL |
no | https://api.sonenta.com |
Override for self-host or staging (SONENTA_API_BASE also accepted, back-compat) |
The token format is vrb_live_<prefix>.<secret> and must carry the mcp:*
scope. For the project_context_* tools, also grant project:read and/or
project:settings:write — see the Project context document section
above. Treat the token like any other secret — keychain or .env, never
commit.
If your API key is pinned to a single project (its project_uuid is set
server-side), listing additional UUIDs in SONENTA_PROJECTS will surface
as a 403 API key is scoped to a different project from the backend on
any call targeting one of the others.
Local development
cd mcp
uv sync
uv run verbumia-mcp # stdio transport — pipe MCP frames over stdin/stdout
License
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file verbumia_mcp-0.17.0.tar.gz.
File metadata
- Download URL: verbumia_mcp-0.17.0.tar.gz
- Upload date:
- Size: 77.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.20 {"installer":{"name":"uv","version":"0.11.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed265da1e25687f6c5ffeda74dd677d633066a637a9ef70e4982ce17f8d95a11
|
|
| MD5 |
019c7c420afd58db8dfd199565a8e7ed
|
|
| BLAKE2b-256 |
0d03338e5612f0418c9195a19704949e7127a1778680ba38f754f7bda5773d02
|
File details
Details for the file verbumia_mcp-0.17.0-py3-none-any.whl.
File metadata
- Download URL: verbumia_mcp-0.17.0-py3-none-any.whl
- Upload date:
- Size: 25.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.20 {"installer":{"name":"uv","version":"0.11.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1858d8d9c115a0870e63fdc197306fccdf0ac42b8c32c21f24183bc55a5b5f7
|
|
| MD5 |
f3d5a12361342871eda862020a8532b8
|
|
| BLAKE2b-256 |
ce5514bfe5fa8459ef3a5dd20cae97cf463a020b8c0120385e3fb3e067d2f4f8
|