@sonenta/mcp 0.20.1 → 0.21.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sonenta/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.1",
|
|
4
4
|
"description": "MCP server for Sonenta translation management \u2014 wires Claude Desktop and other MCP clients into your project's keys, missing-key feed, and translation drafts.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://sonenta.com",
|
|
Binary file
|
package/python/pyproject.toml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "verbumia-mcp"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.21.1"
|
|
4
4
|
description = "Model Context Protocol server for Verbumia — list projects, missing keys, propose translations from Claude Desktop and other MCP clients."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12,<3.14"
|
|
@@ -25,6 +25,8 @@ Tools (V1 MCP surface; glossary_* added 2026-05-24; reports + trash added 2026-0
|
|
|
25
25
|
- glossary_delete — delete an entry by uuid
|
|
26
26
|
- health_report — read-only project source-health report (#752)
|
|
27
27
|
- coverage_report — read-only project translation-coverage report (#752)
|
|
28
|
+
- list_source_duplicates — read-only list of duplicate-source-value groups (#1116)
|
|
29
|
+
- set_duplicate_status — triage a duplicate group: to_fix | allowed | resolved (#1116)
|
|
28
30
|
- delete_keys_bulk — soft-delete (trash) keys by key_uuid; restorable
|
|
29
31
|
- restore_keys_bulk — restore trashed keys by key_uuid
|
|
30
32
|
- list_trash — list trashed (soft-deleted) keys (cursor paginated)
|
|
@@ -1714,6 +1716,86 @@ def register(server: Server, client: VerbumiaClient) -> tuple[Any, Any]:
|
|
|
1714
1716
|
"additionalProperties": False,
|
|
1715
1717
|
},
|
|
1716
1718
|
),
|
|
1719
|
+
# --- Source Health: duplicate source strings (#1116; backend #1114, PR #147) ---
|
|
1720
|
+
Tool(
|
|
1721
|
+
name="list_source_duplicates",
|
|
1722
|
+
description=(
|
|
1723
|
+
"List groups of keys that SHARE an identical source-language "
|
|
1724
|
+
"value (Source Health duplicates, #1116). Each group = "
|
|
1725
|
+
"{source_value, key_count, key_names[], key_uuids[], status, note}. "
|
|
1726
|
+
"Duplicates inflate translation cost and drift (the same string "
|
|
1727
|
+
"translated N ways), so this is the worklist the "
|
|
1728
|
+
"sonenta-source-health agent repairs. Status is tracked PROJECT-WIDE "
|
|
1729
|
+
"per source_value: to_fix (needs attention; the default), allowed "
|
|
1730
|
+
"(intentional duplicate — listed+flagged but excluded from "
|
|
1731
|
+
"total_issues), resolved (already fixed — re-scan confirms). Filter "
|
|
1732
|
+
"by status to focus. When status=to_fix, a group may also carry a "
|
|
1733
|
+
"human-prepared `merge_plan` ({clusters: [{canonical_key_uuid, "
|
|
1734
|
+
"redundant_key_uuids[]}], survivor_outcome: allowed|differentiate}) "
|
|
1735
|
+
"authored in the dashboard — the consolidation an agent applies "
|
|
1736
|
+
"(merge each cluster onto its canonical key, then allow or "
|
|
1737
|
+
"differentiate whatever still shares the text). READ-ONLY."
|
|
1738
|
+
),
|
|
1739
|
+
inputSchema={
|
|
1740
|
+
"type": "object",
|
|
1741
|
+
"properties": {
|
|
1742
|
+
"project_uuid": {
|
|
1743
|
+
"type": "string",
|
|
1744
|
+
"description": "Project UUID. Required when multiple projects are configured (SONENTA_PROJECTS); defaults to the single configured project otherwise.",
|
|
1745
|
+
},
|
|
1746
|
+
"status": {
|
|
1747
|
+
"type": "string",
|
|
1748
|
+
"enum": ["to_fix", "allowed", "resolved"],
|
|
1749
|
+
"description": "Filter to duplicate groups in this triage status. Omit for all.",
|
|
1750
|
+
},
|
|
1751
|
+
"version_id": {
|
|
1752
|
+
"type": "string",
|
|
1753
|
+
"description": "Optional version UUID; defaults to the production version.",
|
|
1754
|
+
},
|
|
1755
|
+
},
|
|
1756
|
+
"additionalProperties": False,
|
|
1757
|
+
},
|
|
1758
|
+
),
|
|
1759
|
+
Tool(
|
|
1760
|
+
name="set_duplicate_status",
|
|
1761
|
+
description=(
|
|
1762
|
+
"Set the triage STATUS of one duplicate group, addressed by its "
|
|
1763
|
+
"shared source_value (Source Health duplicates, #1116). status ∈ "
|
|
1764
|
+
"to_fix (this duplication should be repaired — the default; "
|
|
1765
|
+
"clears any override), allowed (an intentional, sanctioned "
|
|
1766
|
+
"duplicate — kept but EXCLUDED from total_issues, stop flagging "
|
|
1767
|
+
"it), resolved (the duplication has been fixed — removed from the "
|
|
1768
|
+
"list, a re-scan confirms). An invalid status returns 422. Status "
|
|
1769
|
+
"persists PROJECT-WIDE per source_value. Use this after the "
|
|
1770
|
+
"sonenta-source-health agent has de-duplicated the keys, to mark "
|
|
1771
|
+
"the group resolved, or to whitelist a legitimate duplicate as "
|
|
1772
|
+
"allowed. An optional note records WHY (audit trail)."
|
|
1773
|
+
),
|
|
1774
|
+
inputSchema={
|
|
1775
|
+
"type": "object",
|
|
1776
|
+
"properties": {
|
|
1777
|
+
"project_uuid": {
|
|
1778
|
+
"type": "string",
|
|
1779
|
+
"description": "Project UUID. Required when multiple projects are configured (SONENTA_PROJECTS); defaults to the single configured project otherwise.",
|
|
1780
|
+
},
|
|
1781
|
+
"source_value": {
|
|
1782
|
+
"type": "string",
|
|
1783
|
+
"description": "The shared source-language value identifying the duplicate group (from list_source_duplicates).",
|
|
1784
|
+
},
|
|
1785
|
+
"status": {
|
|
1786
|
+
"type": "string",
|
|
1787
|
+
"enum": ["to_fix", "allowed", "resolved"],
|
|
1788
|
+
"description": "New triage status for the group.",
|
|
1789
|
+
},
|
|
1790
|
+
"note": {
|
|
1791
|
+
"type": "string",
|
|
1792
|
+
"description": "Optional human/agent note recording why the status was set (audit trail).",
|
|
1793
|
+
},
|
|
1794
|
+
},
|
|
1795
|
+
"required": ["source_value", "status"],
|
|
1796
|
+
"additionalProperties": False,
|
|
1797
|
+
},
|
|
1798
|
+
),
|
|
1717
1799
|
]
|
|
1718
1800
|
|
|
1719
1801
|
@server.call_tool()
|
|
@@ -2294,6 +2376,39 @@ def register(server: Server, client: VerbumiaClient) -> tuple[Any, Any]:
|
|
|
2294
2376
|
f"/v1/mcp/projects/{project_uuid}/cognitive/analyze", json=body
|
|
2295
2377
|
)
|
|
2296
2378
|
return _text(data)
|
|
2379
|
+
# --- Source Health: duplicates (#1116; backend #1114, PR #147) ---
|
|
2380
|
+
if name == "list_source_duplicates":
|
|
2381
|
+
project_uuid = _project_uuid(args, client)
|
|
2382
|
+
params = {
|
|
2383
|
+
k: v
|
|
2384
|
+
for k, v in {
|
|
2385
|
+
"status": args.get("status"),
|
|
2386
|
+
"version_id": args.get("version_id"),
|
|
2387
|
+
}.items()
|
|
2388
|
+
if v is not None
|
|
2389
|
+
}
|
|
2390
|
+
data = await client.get(
|
|
2391
|
+
f"/v1/mcp/projects/{project_uuid}/source-duplicates",
|
|
2392
|
+
params=params,
|
|
2393
|
+
)
|
|
2394
|
+
return _text(data)
|
|
2395
|
+
if name == "set_duplicate_status":
|
|
2396
|
+
project_uuid = _project_uuid(args, client)
|
|
2397
|
+
if not args.get("source_value"):
|
|
2398
|
+
return _err("source_value is required")
|
|
2399
|
+
if not args.get("status"):
|
|
2400
|
+
return _err("status is required")
|
|
2401
|
+
body: dict[str, Any] = {
|
|
2402
|
+
"source_value": args["source_value"],
|
|
2403
|
+
"status": args["status"],
|
|
2404
|
+
}
|
|
2405
|
+
if args.get("note"):
|
|
2406
|
+
body["note"] = args["note"]
|
|
2407
|
+
data = await client.put(
|
|
2408
|
+
f"/v1/mcp/projects/{project_uuid}/source-duplicates/status",
|
|
2409
|
+
json=body,
|
|
2410
|
+
)
|
|
2411
|
+
return _text(data)
|
|
2297
2412
|
return _err(f"unknown tool: {name}")
|
|
2298
2413
|
except VerbumiaApiError as exc:
|
|
2299
2414
|
return _err(f"API {exc.status}: {exc.body}")
|
|
Binary file
|