@sonenta/mcp 0.21.1 → 0.21.3
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 +5 -5
- package/bin/sonenta-mcp.js +9 -9
- package/package.json +4 -5
- package/python/README.md +23 -18
- package/python/dist/sonenta_mcp-0.21.3-py3-none-any.whl +0 -0
- package/python/pyproject.toml +10 -10
- package/python/verbumia_mcp/__init__.py +2 -2
- package/python/verbumia_mcp/__main__.py +2 -2
- package/python/verbumia_mcp/client.py +2 -2
- package/python/verbumia_mcp/server.py +7 -7
- package/python/verbumia_mcp/tools.py +44 -1
- package/python/dist/verbumia_mcp-0.21.1-py3-none-any.whl +0 -0
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 `
|
|
8
|
+
runs the bundled `sonenta-mcp` directly.
|
|
9
9
|
|
|
10
10
|
## Use it from Claude Desktop
|
|
11
11
|
|
|
@@ -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>
|
|
51
|
+
1. **`uvx --from <bundled_wheel> sonenta-mcp`** — fastest, ephemeral
|
|
52
52
|
venv. Recommended.
|
|
53
|
-
2. **`uv run --project <bundled_dir>
|
|
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>
|
|
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.
|
|
@@ -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/
|
|
84
|
+
# -> @sonenta/mcp bundled wheel: <node_modules>/.../python/dist/sonenta_mcp-…whl
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
## License
|
package/bin/sonenta-mcp.js
CHANGED
|
@@ -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>
|
|
10
|
-
* 3. pipx run --spec <bundled_wheel>
|
|
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, "
|
|
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, "
|
|
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, "
|
|
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
|
-
* ~/.
|
|
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
|
|
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(), ".
|
|
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, "
|
|
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.
|
|
3
|
+
"version": "0.21.3",
|
|
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/
|
|
9
|
+
"url": "https://github.com/sonenta/tools.git",
|
|
10
10
|
"directory": "mcp/npm"
|
|
11
11
|
},
|
|
12
12
|
"bugs": {
|
|
13
|
-
"url": "https://github.com/
|
|
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
|
|
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
|
-
#
|
|
1
|
+
# Sonenta MCP server
|
|
2
2
|
|
|
3
|
-
Model Context Protocol server for [
|
|
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 @
|
|
36
|
+
npx -y @sonenta/mcp
|
|
37
37
|
|
|
38
38
|
# Or from PyPI:
|
|
39
|
-
pipx install
|
|
39
|
+
pipx install sonenta-mcp
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
A Homebrew tap (`brew install
|
|
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
|
-
"
|
|
54
|
+
"sonenta": {
|
|
55
55
|
"command": "npx",
|
|
56
|
-
"args": ["-y", "@
|
|
56
|
+
"args": ["-y", "@sonenta/mcp"],
|
|
57
57
|
"env": {
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
58
|
+
"SONENTA_API_KEY": "vrb_live_<prefix>.<secret>",
|
|
59
|
+
"SONENTA_PROJECTS": "<project_uuid>",
|
|
60
|
+
"SONENTA_BASE_URL": "https://api.sonenta.com"
|
|
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
|
-
"
|
|
73
|
-
"
|
|
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
|
-
| `
|
|
84
|
-
| `
|
|
85
|
-
| `
|
|
86
|
-
| `
|
|
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.com` | 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 `
|
|
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
|
|
109
|
+
uv run sonenta-mcp # stdio transport — pipe MCP frames over stdin/stdout
|
|
105
110
|
```
|
|
106
111
|
|
|
107
112
|
## License
|
|
Binary file
|
package/python/pyproject.toml
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
[project]
|
|
2
|
-
name = "
|
|
3
|
-
version = "0.21.
|
|
4
|
-
description = "Model Context Protocol server for
|
|
2
|
+
name = "sonenta-mcp"
|
|
3
|
+
version = "0.21.3"
|
|
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 = "
|
|
9
|
-
keywords = ["mcp", "
|
|
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
|
-
|
|
22
|
+
sonenta-mcp = "verbumia_mcp.__main__:main"
|
|
23
23
|
|
|
24
24
|
[project.urls]
|
|
25
|
-
Homepage = "https://
|
|
26
|
-
Documentation = "https://
|
|
27
|
-
Source = "https://github.com/
|
|
28
|
-
Issues = "https://github.com/
|
|
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
|
-
"""
|
|
1
|
+
"""Sonenta MCP server (MIT)."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.21.
|
|
3
|
+
__version__ = "0.21.3"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Entrypoint for `
|
|
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"
|
|
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
|
|
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"
|
|
24
|
+
super().__init__(f"Sonenta API error {status}: {body}")
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
class VerbumiaClient:
|
|
@@ -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"
|
|
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
|
|
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
|
-
"
|
|
59
|
+
"Sonenta → Org Settings → API Keys."
|
|
60
60
|
) from exc
|
|
61
61
|
raise RuntimeError(
|
|
62
|
-
f"
|
|
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"
|
|
74
|
-
server: Server = Server("
|
|
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="
|
|
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
|
|
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
|
),
|
|
@@ -239,6 +239,40 @@ def register(server: Server, client: VerbumiaClient) -> tuple[Any, Any]:
|
|
|
239
239
|
"additionalProperties": False,
|
|
240
240
|
},
|
|
241
241
|
),
|
|
242
|
+
Tool(
|
|
243
|
+
name="distribution_info",
|
|
244
|
+
description=(
|
|
245
|
+
"Get the project's CDN distribution status: the public CDN base "
|
|
246
|
+
"URL + bundle URL template, the production version, which "
|
|
247
|
+
"(language, namespace) bundles are currently published, and any "
|
|
248
|
+
"gaps (bundles not yet published). Use to see what client SDKs "
|
|
249
|
+
"can fetch right now."
|
|
250
|
+
),
|
|
251
|
+
inputSchema={
|
|
252
|
+
"type": "object",
|
|
253
|
+
"properties": {
|
|
254
|
+
"project_uuid": {
|
|
255
|
+
"type": "string",
|
|
256
|
+
"description": "Project UUID. Required when multiple projects are configured (SONENTA_PROJECTS); defaults to the single configured project otherwise.",
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
"additionalProperties": False,
|
|
260
|
+
},
|
|
261
|
+
),
|
|
262
|
+
Tool(
|
|
263
|
+
name="sonenta_guide",
|
|
264
|
+
description=(
|
|
265
|
+
"Get the Sonenta usage guide: a concise, up-to-date overview of "
|
|
266
|
+
"how this Sonenta instance works — core concepts, the translation "
|
|
267
|
+
"workflow, how to publish to the CDN, and the available MCP tools. "
|
|
268
|
+
"Takes no arguments. Call this first when unsure how to use Sonenta."
|
|
269
|
+
),
|
|
270
|
+
inputSchema={
|
|
271
|
+
"type": "object",
|
|
272
|
+
"properties": {},
|
|
273
|
+
"additionalProperties": False,
|
|
274
|
+
},
|
|
275
|
+
),
|
|
242
276
|
Tool(
|
|
243
277
|
name="list_keys",
|
|
244
278
|
description=(
|
|
@@ -1814,6 +1848,15 @@ def register(server: Server, client: VerbumiaClient) -> tuple[Any, Any]:
|
|
|
1814
1848
|
project_uuid = _project_uuid(args, client)
|
|
1815
1849
|
data = await client.get(f"/v1/mcp/projects/{project_uuid}")
|
|
1816
1850
|
return _text(data)
|
|
1851
|
+
if name == "distribution_info":
|
|
1852
|
+
project_uuid = _project_uuid(args, client)
|
|
1853
|
+
data = await client.get(
|
|
1854
|
+
f"/v1/mcp/projects/{project_uuid}/distribution"
|
|
1855
|
+
)
|
|
1856
|
+
return _text(data)
|
|
1857
|
+
if name == "sonenta_guide":
|
|
1858
|
+
data = await client.get("/v1/mcp/guide")
|
|
1859
|
+
return _text(data)
|
|
1817
1860
|
if name == "list_keys":
|
|
1818
1861
|
project_uuid = _project_uuid(args, client)
|
|
1819
1862
|
params = {
|
|
Binary file
|