@sonenta/mcp 0.26.0 → 0.27.0

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.26.0",
3
+ "version": "0.27.0",
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",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sonenta-mcp"
3
- version = "0.26.0"
3
+ version = "0.27.0"
4
4
  description = "Model Context Protocol server for Sonenta — 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"
@@ -1,3 +1,3 @@
1
1
  """Sonenta MCP server (MIT)."""
2
2
 
3
- __version__ = "0.26.0"
3
+ __version__ = "0.27.0"
@@ -1881,6 +1881,76 @@ def register(server: Server, client: VerbumiaClient) -> tuple[Any, Any]:
1881
1881
  "additionalProperties": False,
1882
1882
  },
1883
1883
  ),
1884
+ Tool(
1885
+ name="list_a11y_review_queue",
1886
+ description=(
1887
+ "Read the a11y REVIEW QUEUE — the per-(key, locale, surface) review "
1888
+ "items with their state. Each item: {key_uuid, key_name, "
1889
+ "namespace_slug, surface, surface_kind, locale, state (missing | draft "
1890
+ "| translated | reviewed | approved | rejected), value, is_bot, gap, "
1891
+ "base_value, screenshots[], drift, ignored, ignore_reason, "
1892
+ "reject_reason}; the envelope carries by_state / by_surface rollups. "
1893
+ "**Pass state='rejected' to drive the RECTIFICATION loop**: a reviewer "
1894
+ "rejected a suggestion and left a `reject_reason` — the retained "
1895
+ "`value` is the rejected text and `reject_reason` is the human's "
1896
+ "instruction. The agent regenerates a corrected value addressing the "
1897
+ "reason and re-proposes via set_a11y_variant (rejected is unprotected, "
1898
+ "so it returns to draft). Defaults to the production version. READ-ONLY."
1899
+ ),
1900
+ inputSchema={
1901
+ "type": "object",
1902
+ "properties": {
1903
+ "project_uuid": {
1904
+ "type": "string",
1905
+ "description": "Project UUID. Required when multiple projects are configured (SONENTA_PROJECTS); defaults to the single configured project otherwise.",
1906
+ },
1907
+ "version_id": {
1908
+ "type": "string",
1909
+ "description": "Optional version UUID; defaults to the production version.",
1910
+ },
1911
+ "state": {
1912
+ "type": "string",
1913
+ "enum": [
1914
+ "missing",
1915
+ "draft",
1916
+ "translated",
1917
+ "reviewed",
1918
+ "approved",
1919
+ "rejected",
1920
+ ],
1921
+ "description": "Filter to one review state. Use 'rejected' for the rectification loop (items carry reject_reason).",
1922
+ },
1923
+ "locale": {
1924
+ "type": "string",
1925
+ "description": "Filter to one locale code (e.g. 'fr'). Use 'source' for source-locale rows.",
1926
+ },
1927
+ "surface": {
1928
+ "type": "string",
1929
+ "enum": list(A11Y_SURFACES),
1930
+ "description": "Filter to one a11y surface.",
1931
+ },
1932
+ "namespace_uuid": {
1933
+ "type": "string",
1934
+ "description": "Restrict to one namespace by its UUID.",
1935
+ },
1936
+ "key_uuid": {
1937
+ "type": "string",
1938
+ "description": "Restrict to one key by its UUID.",
1939
+ },
1940
+ "include_ignored": {
1941
+ "type": "boolean",
1942
+ "description": "Include items suppressed by the remediation plan (ignored cells). Default false.",
1943
+ },
1944
+ "group_by_key": {
1945
+ "type": "boolean",
1946
+ "description": "Aggregate items by key (one entry per key with its surfaces/locales nested) instead of a flat list.",
1947
+ },
1948
+ "limit": {"type": "integer", "minimum": 1, "maximum": 500},
1949
+ "offset": {"type": "integer", "minimum": 0},
1950
+ },
1951
+ "additionalProperties": False,
1952
+ },
1953
+ ),
1884
1954
  Tool(
1885
1955
  name="a11y_remediation_plan_get",
1886
1956
  description=(
@@ -2716,6 +2786,29 @@ def register(server: Server, client: VerbumiaClient) -> tuple[Any, Any]:
2716
2786
  f"/v1/mcp/projects/{project_uuid}/{segment}", params=params
2717
2787
  )
2718
2788
  return _text(data)
2789
+ if name == "list_a11y_review_queue":
2790
+ project_uuid = _project_uuid(args, client)
2791
+ params: dict[str, Any] = {}
2792
+ for opt in (
2793
+ "version_id",
2794
+ "state",
2795
+ "locale",
2796
+ "surface",
2797
+ "namespace_uuid",
2798
+ "key_uuid",
2799
+ "limit",
2800
+ "offset",
2801
+ ):
2802
+ if args.get(opt) is not None:
2803
+ params[opt] = args[opt]
2804
+ if args.get("include_ignored"):
2805
+ params["include_ignored"] = "true"
2806
+ if args.get("group_by_key"):
2807
+ params["group_by_key"] = "true"
2808
+ data = await client.get(
2809
+ f"/v1/mcp/projects/{project_uuid}/a11y/review/queue", params=params
2810
+ )
2811
+ return _text(data)
2719
2812
  if name == "a11y_remediation_plan_get":
2720
2813
  project_uuid = _project_uuid(args, client)
2721
2814
  params: dict[str, Any] = {}