@sonenta/mcp 0.21.1 → 0.21.2

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/README.md CHANGED
@@ -5,7 +5,7 @@ other Model Context Protocol clients into your translation project.
5
5
 
6
6
  This npm package **bundles the Python MCP server source** (no PyPI
7
7
  download). The launcher picks the best Python runtime on your host and
8
- runs the bundled `verbumia_mcp` directly.
8
+ runs the bundled `sonenta-mcp` directly.
9
9
 
10
10
  ## Use it from Claude Desktop
11
11
 
@@ -18,7 +18,7 @@ runs the bundled `verbumia_mcp` directly.
18
18
  "env": {
19
19
  "SONENTA_API_KEY": "vrb_live_<prefix>.<secret>",
20
20
  "SONENTA_PROJECTS": "<project_uuid>",
21
- "SONENTA_BASE_URL": "https://api.sonenta.com"
21
+ "SONENTA_BASE_URL": "https://api.sonenta.dev"
22
22
  }
23
23
  }
24
24
  }
@@ -48,11 +48,11 @@ become callable from your prompt.
48
48
  The npm tarball ships the Python sources under `python/` plus a pre-built
49
49
  wheel under `python/dist/`. The Node bin tries these in order:
50
50
 
51
- 1. **`uvx --from <bundled_wheel> verbumia-mcp`** — fastest, ephemeral
51
+ 1. **`uvx --from <bundled_wheel> sonenta-mcp`** — fastest, ephemeral
52
52
  venv. Recommended.
53
- 2. **`uv run --project <bundled_dir> verbumia-mcp`** — uv-managed,
53
+ 2. **`uv run --project <bundled_dir> sonenta-mcp`** — uv-managed,
54
54
  resolves deps from `pyproject.toml`.
55
- 3. **`pipx run --spec <bundled_wheel> verbumia-mcp`** — pipx-managed.
55
+ 3. **`pipx run --spec <bundled_wheel> sonenta-mcp`** — pipx-managed.
56
56
  4. **Ad-hoc venv at `~/.sonenta/mcp-venv-<wheelhash>/`** — last-resort
57
57
  fallback that requires only `python3 >= 3.12`. Slow first run, fast
58
58
  thereafter.
@@ -64,7 +64,7 @@ Stdio is fully passthrough so the MCP JSON-RPC framing is preserved.
64
64
  | Var | Required | Default | Notes |
65
65
  |----------------------|----------|-----------------------------|--------------------------------------------------------|
66
66
  | `SONENTA_API_KEY` | yes | | Bearer ApiKey token. `SONENTA_TOKEN` accepted (back-compat) |
67
- | `SONENTA_BASE_URL` | no | `https://api.sonenta.com` | Self-host / staging override. `SONENTA_API_BASE` accepted (back-compat) |
67
+ | `SONENTA_BASE_URL` | no | `https://api.sonenta.dev` | Self-host / staging override. `SONENTA_API_BASE` accepted (back-compat) |
68
68
  | `SONENTA_PROJECTS` | no | (LLM picks per call) | CSV of project UUIDs. When >1, the LLM MUST pass `project_uuid` per call. |
69
69
  | `SONENTA_PROJECT` | no | (legacy) | Singular fallback for v0.10.x users. Ignored when `SONENTA_PROJECTS` is set (warns). |
70
70
 
@@ -81,7 +81,7 @@ One of:
81
81
  ```bash
82
82
  npx -y @sonenta/mcp --self-check
83
83
  # -> @sonenta/mcp launchers detected: uvx, uv, python3
84
- # -> @sonenta/mcp bundled wheel: <node_modules>/.../python/dist/verbumia_mcp-…whl
84
+ # -> @sonenta/mcp bundled wheel: <node_modules>/.../python/dist/sonenta_mcp-…whl
85
85
  ```
86
86
 
87
87
  ## License
@@ -6,8 +6,8 @@
6
6
  * (no PyPI dependency). Spawns it via the first available Python launcher:
7
7
  *
8
8
  * 1. uvx --from <bundled_wheel> — fastest, ephemeral venv
9
- * 2. uv run --project <bundled_dir> verbumia-mcp — uv-managed
10
- * 3. pipx run --spec <bundled_wheel> verbumia-mcp — pipx-managed
9
+ * 2. uv run --project <bundled_dir> sonenta-mcp — uv-managed
10
+ * 3. pipx run --spec <bundled_wheel> sonenta-mcp — pipx-managed
11
11
  * 4. python3 + ad-hoc venv — last-resort, slowest first run
12
12
  *
13
13
  * Stdio is fully passthrough so the MCP JSON-RPC framing is preserved.
@@ -40,7 +40,7 @@ function runInherit(cmd, args) {
40
40
 
41
41
  function tryUvx(passthroughArgs) {
42
42
  if (!which("uvx") || !BUNDLED_WHEEL) return false;
43
- runInherit("uvx", ["--from", BUNDLED_WHEEL, "verbumia-mcp", ...passthroughArgs]);
43
+ runInherit("uvx", ["--from", BUNDLED_WHEEL, "sonenta-mcp", ...passthroughArgs]);
44
44
  return true;
45
45
  }
46
46
 
@@ -48,7 +48,7 @@ function tryUvRun(passthroughArgs) {
48
48
  if (!which("uv")) return false;
49
49
  runInherit(
50
50
  "uv",
51
- ["run", "--project", BUNDLED_PY_DIR, "verbumia-mcp", ...passthroughArgs],
51
+ ["run", "--project", BUNDLED_PY_DIR, "sonenta-mcp", ...passthroughArgs],
52
52
  );
53
53
  return true;
54
54
  }
@@ -57,16 +57,16 @@ function tryPipxRun(passthroughArgs) {
57
57
  if (!which("pipx") || !BUNDLED_WHEEL) return false;
58
58
  runInherit(
59
59
  "pipx",
60
- ["run", "--spec", BUNDLED_WHEEL, "verbumia-mcp", ...passthroughArgs],
60
+ ["run", "--spec", BUNDLED_WHEEL, "sonenta-mcp", ...passthroughArgs],
61
61
  );
62
62
  return true;
63
63
  }
64
64
 
65
65
  /**
66
66
  * Last-resort fallback: bootstrap an ad-hoc venv under
67
- * ~/.verbumia/mcp-venv-<wheelhash> and reuse it on subsequent runs. Slow
67
+ * ~/.sonenta/mcp-venv-<wheelhash> and reuse it on subsequent runs. Slow
68
68
  * first run; subsequent runs reuse the venv (keyed by wheel sha so a
69
- * future verbumia-mcp version triggers a fresh venv automatically).
69
+ * future sonenta-mcp version triggers a fresh venv automatically).
70
70
  */
71
71
  function tryAdhocVenv(passthroughArgs) {
72
72
  if (!which("python3") || !BUNDLED_WHEEL) return false;
@@ -75,10 +75,10 @@ function tryAdhocVenv(passthroughArgs) {
75
75
  .update(fs.readFileSync(BUNDLED_WHEEL))
76
76
  .digest("hex")
77
77
  .slice(0, 12);
78
- const venvRoot = path.join(os.homedir(), ".verbumia", "mcp-venv-" + wheelHash);
78
+ const venvRoot = path.join(os.homedir(), ".sonenta", "mcp-venv-" + wheelHash);
79
79
  const venvBin = path.join(venvRoot, "bin");
80
80
  const venvPy = path.join(venvBin, "python");
81
- const venvEntry = path.join(venvBin, "verbumia-mcp");
81
+ const venvEntry = path.join(venvBin, "sonenta-mcp");
82
82
 
83
83
  if (!fs.existsSync(venvEntry)) {
84
84
  process.stderr.write(
package/package.json CHANGED
@@ -1,21 +1,20 @@
1
1
  {
2
2
  "name": "@sonenta/mcp",
3
- "version": "0.21.1",
3
+ "version": "0.21.2",
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",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "https://github.com/verbumia/verbumia-tools.git",
9
+ "url": "https://github.com/sonenta/tools.git",
10
10
  "directory": "mcp/npm"
11
11
  },
12
12
  "bugs": {
13
- "url": "https://github.com/verbumia/verbumia-tools/issues"
13
+ "url": "https://github.com/sonenta/tools/issues"
14
14
  },
15
15
  "keywords": [
16
16
  "mcp",
17
17
  "sonenta",
18
- "verbumia",
19
18
  "i18n",
20
19
  "translations",
21
20
  "claude",
@@ -37,6 +36,6 @@
37
36
  ],
38
37
  "scripts": {
39
38
  "test": "node bin/sonenta-mcp.js --self-check",
40
- "prepublishOnly": "cd python && uv build && rm -f dist/verbumia_mcp-*.tar.gz && printf '' > dist/.npmignore"
39
+ "prepublishOnly": "cd python && uv build && rm -f dist/*.tar.gz && printf '' > dist/.npmignore"
41
40
  }
42
41
  }
package/python/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # Verbumia MCP server
1
+ # Sonenta MCP server
2
2
 
3
- Model Context Protocol server for [Verbumia](https://verbumia.ca) — exposes
3
+ Model Context Protocol server for [Sonenta](https://sonenta.com) — exposes
4
4
  your translation project to Claude Desktop and other MCP clients.
5
5
 
6
6
  ## Status
@@ -33,13 +33,13 @@ the precise scope on the key.
33
33
 
34
34
  ```bash
35
35
  # Recommended (zero-install, used by Claude Desktop's mcp.json):
36
- npx -y @verbumia/mcp
36
+ npx -y @sonenta/mcp
37
37
 
38
38
  # Or from PyPI:
39
- pipx install verbumia-mcp
39
+ pipx install sonenta-mcp
40
40
  ```
41
41
 
42
- A Homebrew tap (`brew install verbumia/tap/verbumia-mcp`) is coming once we
42
+ A Homebrew tap (`brew install sonenta/tap/sonenta-mcp`) is coming once we
43
43
  publish to npm.
44
44
 
45
45
  ## Configure (Claude Desktop)
@@ -51,13 +51,13 @@ Single-project setup:
51
51
  ```json
52
52
  {
53
53
  "mcpServers": {
54
- "verbumia": {
54
+ "sonenta": {
55
55
  "command": "npx",
56
- "args": ["-y", "@verbumia/mcp"],
56
+ "args": ["-y", "@sonenta/mcp"],
57
57
  "env": {
58
- "VERBUMIA_API_KEY": "vrb_live_<prefix>.<secret>",
59
- "VERBUMIA_PROJECTS": "<project_uuid>",
60
- "VERBUMIA_BASE_URL": "https://api.verbumia.dev"
58
+ "SONENTA_API_KEY": "vrb_live_<prefix>.<secret>",
59
+ "SONENTA_PROJECTS": "<project_uuid>",
60
+ "SONENTA_BASE_URL": "https://api.sonenta.dev"
61
61
  }
62
62
  }
63
63
  }
@@ -69,8 +69,8 @@ Multi-project setup (v0.11+) — comma-separate the UUIDs and Claude will pass
69
69
 
70
70
  ```json
71
71
  "env": {
72
- "VERBUMIA_API_KEY": "vrb_live_<prefix>.<secret>",
73
- "VERBUMIA_PROJECTS": "01993a..,01993b..,01993c.."
72
+ "SONENTA_API_KEY": "vrb_live_<prefix>.<secret>",
73
+ "SONENTA_PROJECTS": "01993a..,01993b..,01993c.."
74
74
  }
75
75
  ```
76
76
 
@@ -80,10 +80,15 @@ Restart Claude Desktop. Tools show up in the prompt UI.
80
80
 
81
81
  | Variable | Required | Default | Description |
82
82
  |----------------------|----------|--------------------------------|--------------------------------------------------------------------------------------------|
83
- | `VERBUMIA_API_KEY` | yes | | API key from Org Settings → API Keys (`VERBUMIA_TOKEN` also accepted, back-compat) |
84
- | `VERBUMIA_PROJECTS` | no | (LLM passes per call) | CSV of project UUIDs. When >1, the LLM MUST pass `project_uuid` on each tool call. |
85
- | `VERBUMIA_PROJECT` | no | (legacy) | Singular fallback for v0.10.x users. Ignored when `VERBUMIA_PROJECTS` is set (warns). |
86
- | `VERBUMIA_BASE_URL` | no | `https://api.verbumia.dev` | Override for self-host or staging (`VERBUMIA_API_BASE` also accepted, back-compat) |
83
+ | `SONENTA_API_KEY` | yes | | API key from Org Settings → API Keys (`SONENTA_TOKEN` also accepted, back-compat) |
84
+ | `SONENTA_PROJECTS` | no | (LLM passes per call) | CSV of project UUIDs. When >1, the LLM MUST pass `project_uuid` on each tool call. |
85
+ | `SONENTA_PROJECT` | no | (legacy) | Singular fallback for v0.10.x users. Ignored when `SONENTA_PROJECTS` is set (warns). |
86
+ | `SONENTA_BASE_URL` | no | `https://api.sonenta.dev` | Override for self-host or staging (`SONENTA_API_BASE` also accepted, back-compat) |
87
+
88
+ > Migrating from `verbumia-mcp`? The legacy `VERBUMIA_API_KEY` / `VERBUMIA_TOKEN`
89
+ > / `VERBUMIA_PROJECTS` / `VERBUMIA_BASE_URL` env vars are still accepted, so
90
+ > existing MCP client configs keep working — switch to the `SONENTA_*` names
91
+ > when convenient.
87
92
 
88
93
  The token format is `vrb_live_<prefix>.<secret>` and must carry the `mcp:*`
89
94
  scope. For the `project_context_*` tools, also grant `project:read` and/or
@@ -92,7 +97,7 @@ above. Treat the token like any other secret — keychain or `.env`, never
92
97
  commit.
93
98
 
94
99
  If your API key is pinned to a single project (its `project_uuid` is set
95
- server-side), listing additional UUIDs in `VERBUMIA_PROJECTS` will surface
100
+ server-side), listing additional UUIDs in `SONENTA_PROJECTS` will surface
96
101
  as a `403 API key is scoped to a different project` from the backend on
97
102
  any call targeting one of the others.
98
103
 
@@ -101,7 +106,7 @@ any call targeting one of the others.
101
106
  ```bash
102
107
  cd mcp
103
108
  uv sync
104
- uv run verbumia-mcp # stdio transport — pipe MCP frames over stdin/stdout
109
+ uv run sonenta-mcp # stdio transport — pipe MCP frames over stdin/stdout
105
110
  ```
106
111
 
107
112
  ## License
@@ -1,12 +1,12 @@
1
1
  [project]
2
- name = "verbumia-mcp"
3
- version = "0.21.1"
4
- description = "Model Context Protocol server for Verbumia — list projects, missing keys, propose translations from Claude Desktop and other MCP clients."
2
+ name = "sonenta-mcp"
3
+ version = "0.21.2"
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"
7
7
  license = { text = "MIT" }
8
- authors = [{ name = "Verbumia" }]
9
- keywords = ["mcp", "verbumia", "i18n", "translations", "claude"]
8
+ authors = [{ name = "Sonenta" }]
9
+ keywords = ["mcp", "sonenta", "i18n", "translations", "claude"]
10
10
  classifiers = [
11
11
  "License :: OSI Approved :: MIT License",
12
12
  "Programming Language :: Python :: 3.12",
@@ -19,13 +19,13 @@ dependencies = [
19
19
  ]
20
20
 
21
21
  [project.scripts]
22
- verbumia-mcp = "verbumia_mcp.__main__:main"
22
+ sonenta-mcp = "verbumia_mcp.__main__:main"
23
23
 
24
24
  [project.urls]
25
- Homepage = "https://verbumia.ca"
26
- Documentation = "https://verbumia.ca/docs/mcp/setup"
27
- Source = "https://github.com/verbumia/verbumia-tools"
28
- Issues = "https://github.com/verbumia/verbumia-tools/issues"
25
+ Homepage = "https://sonenta.com"
26
+ Documentation = "https://sonenta.com/docs/mcp/setup"
27
+ Source = "https://github.com/sonenta/tools"
28
+ Issues = "https://github.com/sonenta/tools/issues"
29
29
 
30
30
  [dependency-groups]
31
31
  dev = [
@@ -1,3 +1,3 @@
1
- """Verbumia MCP server (MIT)."""
1
+ """Sonenta MCP server (MIT)."""
2
2
 
3
- __version__ = "0.21.1"
3
+ __version__ = "0.21.2"
@@ -1,4 +1,4 @@
1
- """Entrypoint for `verbumia-mcp` (and `python -m verbumia_mcp`)."""
1
+ """Entrypoint for `sonenta-mcp` (and `python -m verbumia_mcp`)."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -15,7 +15,7 @@ def main() -> None:
15
15
  sys.exit(130)
16
16
  except RuntimeError as exc:
17
17
  # Configuration errors (missing token, etc.) — print a friendly hint.
18
- print(f"verbumia-mcp: {exc}", file=sys.stderr)
18
+ print(f"sonenta-mcp: {exc}", file=sys.stderr)
19
19
  sys.exit(2)
20
20
 
21
21
 
@@ -1,4 +1,4 @@
1
- """Async HTTP client wrapping the Verbumia REST API.
1
+ """Async HTTP client wrapping the Sonenta REST API.
2
2
 
3
3
  The MCP tools are thin adapters over this client — they translate MCP
4
4
  arguments to API calls and shape the response. Authentication is the
@@ -21,7 +21,7 @@ class VerbumiaApiError(Exception):
21
21
  def __init__(self, status: int, body: str | dict[str, Any]) -> None:
22
22
  self.status = status
23
23
  self.body = body
24
- super().__init__(f"Verbumia API error {status}: {body}")
24
+ super().__init__(f"Sonenta API error {status}: {body}")
25
25
 
26
26
 
27
27
  class VerbumiaClient:
@@ -15,7 +15,7 @@ import os
15
15
  import sys
16
16
  from dataclasses import dataclass
17
17
 
18
- DEFAULT_API_BASE = "https://api.sonenta.com"
18
+ DEFAULT_API_BASE = "https://api.sonenta.dev"
19
19
 
20
20
 
21
21
  @dataclass(frozen=True)
@@ -46,20 +46,20 @@ async def _preflight(client: VerbumiaClient) -> None:
46
46
  """
47
47
  try:
48
48
  await client.get("/v1/mcp/projects", params={"limit": 1})
49
- _info(f"verbumia-mcp: connected to {client.config.api_base}")
49
+ _info(f"sonenta-mcp: connected to {client.config.api_base}")
50
50
  except VerbumiaApiError as exc:
51
51
  if exc.status == 401:
52
52
  raise RuntimeError(
53
- "SONENTA_API_KEY was rejected (401). Verify the key in Verbumia → "
53
+ "SONENTA_API_KEY was rejected (401). Verify the key in Sonenta → "
54
54
  "Org Settings → API Keys; new keys are shown once on creation."
55
55
  ) from exc
56
56
  if exc.status == 403:
57
57
  raise RuntimeError(
58
58
  "API key lacks the `mcp:*` scope (403). Issue a key with mcp:* in "
59
- "Verbumia → Org Settings → API Keys."
59
+ "Sonenta → Org Settings → API Keys."
60
60
  ) from exc
61
61
  raise RuntimeError(
62
- f"Verbumia API rejected the connectivity probe ({exc.status}): {exc.body}"
62
+ f"Sonenta API rejected the connectivity probe ({exc.status}): {exc.body}"
63
63
  ) from exc
64
64
  except Exception as exc:
65
65
  raise RuntimeError(
@@ -70,8 +70,8 @@ async def _preflight(client: VerbumiaClient) -> None:
70
70
 
71
71
  async def run() -> None:
72
72
  config = load_config()
73
- _info(f"verbumia-mcp {__version__} starting (api={config.api_base})")
74
- server: Server = Server("verbumia")
73
+ _info(f"sonenta-mcp {__version__} starting (api={config.api_base})")
74
+ server: Server = Server("sonenta")
75
75
 
76
76
  async with _client_for(config) as client:
77
77
  await _preflight(client)
@@ -81,7 +81,7 @@ async def run() -> None:
81
81
  read_stream,
82
82
  write_stream,
83
83
  InitializationOptions(
84
- server_name="verbumia",
84
+ server_name="sonenta",
85
85
  server_version=__version__,
86
86
  capabilities=ServerCapabilities(tools=ToolsCapability(listChanged=False)),
87
87
  ),
@@ -208,7 +208,7 @@ def register(server: Server, client: VerbumiaClient) -> tuple[Any, Any]:
208
208
  Tool(
209
209
  name="list_projects",
210
210
  description=(
211
- "List projects accessible to the configured Verbumia API key. "
211
+ "List projects accessible to the configured Sonenta API key. "
212
212
  "Project-scoped keys return a single project; org-scoped keys "
213
213
  "return all projects in the org."
214
214
  ),