Skip to content

chore: release notes for 0.2.0, and what the rename to kaitencloud-mcp needs - #7

Merged
Alex (Alexkuva) merged 3 commits into
mainfrom
chore/release-notes-0.2.0
Oct 22, 2026
Merged

Alex (Alexkuva) merged 3 commits into
mainfrom
chore/release-notes-0.2.0

Conversation

@Alexkuva

@Alexkuva Alex (Alexkuva) commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

What does this PR change?

It completes #3, now merged, for the 0.2.0 release. #3 moved the package to kaitencloud-mcp and publishes it on a v* tag; this PR adds what the rename needs, plus the release notes.

  • /health reports the right version. The server reads its version from the distribution kaiten-mcp, which no longer exists under that name. With ci: publish the image to its own package and the Python package to PyPI #3 alone, an installed server reports 0.0.0. It now reads kaitencloud-mcp.

  • uvx kaitencloud-mcp runs the server. uvx runs the command named after the package, and with ci: publish the image to its own package and the Python package to PyPI #3 alone the package only provides kaiten-mcp. kaitencloud-mcp is now the same entry point, and kaiten-mcp stays.

  • /health reads Kaiten Cloud correctly. It probes the gateway's /healthz without a token, and counted only a 200 as reachable. Kaiten Cloud's gateway asks for a token and answers 401, so a server pointed at Kaiten Cloud said degraded, "reachable": false, while every tool worked. A 401 now counts as Kaiten answering, like a 200; a 5xx or no answer still reports degraded. tests/test_health.py covers the four cases through the route.

  • [project.urls] gains the docs page and the changelog, next to ci: publish the image to its own package and the Python package to PyPI #3's homepage, repository and issues.

  • The README and MCP.md install from PyPI (uvx kaitencloud-mcp stdio) and from ghcr.io/kaitencloud/kaiten-mcp:0.2, a tag ci: publish the image to its own package and the Python package to PyPI #3's rules produce, instead of the repository. Building from a checkout stays as the third way.

  • CHANGELOG.md starts at 0.2.0.

  • MCP.md's troubleshooting says what a client actually receives:

    • a bad token gets Kaiten's 401 [ValidateToken.Invalid] from each tool call, not a 401 from /mcp: the server forwards the credential without checking it;
    • a call with no credential gets No Kaiten credential;
    • a missing scope gets Kaiten API error (403 Forbidden) [Auth.MissingScope], with the scope named.

    The console labels are Service Accounts and Generate Token.

It replaces #6, the same two commits stacked on #3's branch. Once #3 was squash-merged, updating #6 from main left two [project.urls] tables in pyproject.toml and a merge commit without a sign-off, so this branch takes the two commits again on top of main instead. #5, which duplicated #3, was closed before.

Why?

Without the first two changes, the release #3 publishes would report a wrong version and would not start with the command its own package name suggests.

Testing

  • main after ci: publish the image to its own package and the Python package to PyPI #3, built: the server reports version 0.0.0, and the package provides no kaitencloud-mcp command.

  • This branch, built:

    • uvx --from ./dist/kaitencloud_mcp-0.2.0-py3-none-any.whl kaitencloud-mcp --help and the same with kaiten-mcp both answer;
    • the server reports 0.2.0.
  • uvx uv@0.9.1 lock --check passes: the lockfile ci: publish the image to its own package and the Python package to PyPI #3 relocked stays valid, since a console script is not part of it.

  • /health from this branch, run for real:

    • against https://app.kaiten.sh/api: ok, reachable: true, status: 401;
    • against a local stack: ok, status: 200;
    • against an address with nothing listening: degraded, All connection attempts failed.

    On the code before the fix, the new test's kaiten-cloud case fails.

  • uv run ruff check ., uv run ruff format --check ., uv run pytest: 61 passed.

  • The server, against a fresh task quickstart of kaiten main, through an MCP client:

    • uv run pytest -m e2e: 5 passed;
    • a read:* token gets 403 [Auth.MissingScope] from a write tool, and an invalid token gets 401 [ValidateToken.Invalid];
    • kaiten_delete previews until confirm=true;
    • the read-only server lists 15 tools.

Checklist

  • I have read CONTRIBUTING.md.
  • Every commit in this PR includes a valid DCO Signed-off-by line.
  • I have the right to submit all material in this PR.
  • I have not included secrets or confidential data.
  • I have updated tests where appropriate.
  • I have updated documentation where appropriate.
  • I have preserved required third-party licenses and attributions.

🤖 Generated with Claude Code · ✅ Tested and approved by Alex (@Alexkuva), maintainer

Alex (Alexkuva) and others added 2 commits October 22, 2026 11:20
…p needs

On top of the move to kaitencloud-mcp, three things the package needs:

- /health read its version from the distribution kaiten-mcp, which no
  longer exists under that name: an installed server reported 0.0.0. It
  reads kaitencloud-mcp.
- uvx runs the command named after the package, and the package only had
  kaiten-mcp: `uvx kaitencloud-mcp` found nothing to run. kaitencloud-mcp
  is now the same entry point; kaiten-mcp stays.
- The project URLs gain the docs page and the changelog.

The README and MCP.md install from PyPI and from
ghcr.io/kaitencloud/kaiten-mcp:0.2 instead of the repository, building
from a checkout stays as the third way, and CHANGELOG.md starts at 0.2.0.

Signed-off-by: Alexandre Bergere <alexandre.bergere@kaiten.sh>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The server forwards a request's credential without checking it, so a bad
token does not make /mcp answer 401: the endpoint answers, lists the
tools, and each call returns Kaiten's own error, `Kaiten API error (401
Unauthorized) [ValidateToken.Invalid]`. A call with no credential at all
answers `No Kaiten credential`. A missing scope reads `Kaiten API error
(403 Forbidden) [Auth.MissingScope]`, with the scope named. Each was run
against a local Kaiten, over stdio and over Streamable HTTP.

The console's page is Service Accounts, and its action Generate Token.

Signed-off-by: Alexandre Bergere <alexandre.bergere@kaiten.sh>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
/health probes the gateway's /healthz without a token, and counted only a
200 as reachable. A Community Edition gateway serves /healthz to anyone;
Kaiten Cloud's asks for a token and answers 401. So a server pointed at
Kaiten Cloud reported "degraded" with "reachable": false, while every
tool call, which carries the caller's token, worked.

A 401 now counts as Kaiten answering at that address, like a 200. A 5xx,
or no answer at all, still reports "degraded". tests/test_health.py
covers the four cases through the route itself.

Signed-off-by: Alexandre Bergere <alexandre.bergere@kaiten.sh>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Alexkuva
Alex (Alexkuva) merged commit 6e8612d into main Oct 22, 2026
8 checks passed
@Alexkuva
Alex (Alexkuva) deleted the chore/release-notes-0.2.0 branch October 22, 2026 09:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants