Kaiten MCP Server
An MCP server that lets an AI agent (Claude, Cursor, Copilot, any MCP client) run Kaiten: onboard customers, provision instances, shape Licenses and entitlements, meter usage, target feature flags and ship releases — in Kaiten's own vocabulary, not in HTTP verbs.
"Which customers are close to a limit?" → kaiten_get_usage(min_percent=80)
"Move Ninja Osaka to Premium and renew it for a → kaiten_update_instance(instance="ninja-osaka-prod",
year" plan="premium", extend_license_days=365)
"Give Starter 20 more menu items, without → kaiten_save_license(new_version_of="starter",
touching existing customers" grants={"menu-items": 25})
"Why doesn't Sakura see the analytics dashboard?" → kaiten_evaluate_flags(instance="sakura-tokyo-prod")
Design
The previous server turned every OpenAPI operation into a tool: 105 tools, one per endpoint, each asking the agent for UUIDs and full replacement bodies. This one exposes 31 tools, each an intent, built on the rules in Kaiten's product vision for agent-readiness:
- Tools express an intent, not a CRUD mirror.
kaiten_provision_instanceresolves a License family to its current version, finds the zone, creates the customer if asked and sets the license term; the agent never handles an id.kaiten_get_customeranswers "how is this customer doing" in one call. - Reads return slices, never the whole catalog. Resources are projected onto the fields that carry
meaning, named by slug, with usage already set against its limit (
used,limit,percent,state). - Writes merge, and report truthfully. Only what an agent passes changes. Every write answers with a
status—created,updated,unchanged,recorded,rejected,previewordeleted— and the exactchanges, computed from what Kaiten holds afterwards. A call that changes nothing saysunchangedand writes nothing; a refused usage report or a broken targeting rule saysrejectedand writes nothing. - Identifiers are constrained and stable. Every tool takes slugs, validated before any call.
- Trace before change. Writes that reach other resources say so (
affected_instanceswhen a license version is edited in place, the zone's instances when a release is deployed), andkaiten_deletepreviews its blast radius until called withconfirm=true. - An agent's blast radius is its principal's. Each request carries the caller's own Kaiten token; the
server has no credential of its own.
KAITEN_MCP_READ_ONLY=trueregisters the read tools only.
There is no API contract in this repository. Every call goes through the official
Python SDK (kaitencloud), generated from Kaiten's OpenAPI
document: its methods, its models, its enums (which become the tools' input schemas), its enforcement
arithmetic (kaitencloud.usage) and its flag builders (kaitencloud.targeting). A new API field reaches the
MCP by bumping the SDK.
Tools
| Area | Read | Write |
|---|---|---|
| Orientation | kaiten_overview · kaiten_search |
|
| Customers & instances | kaiten_get_customer · kaiten_get_instance · kaiten_list_instances |
kaiten_save_customer · kaiten_provision_instance · kaiten_update_instance |
| Usage | kaiten_get_usage |
kaiten_report_usage |
| Catalog & Licenses | kaiten_get_catalog |
kaiten_save_entitlement · kaiten_save_license · kaiten_set_license_state |
| Feature flags | kaiten_get_flags · kaiten_evaluate_flags · kaiten_test_rule |
kaiten_save_flag |
| Releases | kaiten_get_deployments |
kaiten_create_release · kaiten_deploy_release · kaiten_save_deployment_zone |
| Access & audit | kaiten_get_access · kaiten_get_audit_trail |
kaiten_issue_token · kaiten_revoke_token |
| Settings | kaiten_get_metadata_fields · kaiten_get_connectors |
kaiten_save_metadata_field · kaiten_configure_connector |
| Deletion | kaiten_delete (previews unless confirm=true) |
Each tool's description and input schema are the reference; kaiten_overview is the intended first call.
In the tools' arguments, plan is a License family, whose current version an instance moves to, and
license an exact License version.
Running it
It speaks both standard MCP transports:
- stdio, for a client that spawns the server on your machine. The token comes from
KAITEN_API_TOKEN. - Streamable HTTP at
/mcp, for a shared or remote server. Each request authenticates with its ownAuthorization: Bearer ksh_...header, which the server forwards to Kaiten untouched.
# from PyPI, with uv
KAITEN_API_BASE_URL=http://localhost:6060/api KAITEN_API_TOKEN=ksh_... uvx kaitencloud-mcp stdio
uvx kaitencloud-mcp http --port 8000
# with Docker
docker run -i --rm -e KAITEN_API_BASE_URL=... -e KAITEN_API_TOKEN=ksh_... ghcr.io/kaitencloud/kaiten-mcp:0.2 stdio
docker run -p 8000:8000 -e KAITEN_API_BASE_URL=... ghcr.io/kaitencloud/kaiten-mcp:0.2 # http, the default
# from a checkout
KAITEN_API_BASE_URL=http://localhost:6060/api KAITEN_API_TOKEN=ksh_... uv run kaiten-mcp stdio
docker build -t kaiten-mcp .
The package is kaitencloud-mcp and the image
ghcr.io/kaitencloud/kaiten-mcp. kaiten-mcp on PyPI is an unrelated project.
MCP.md has the client configurations (Claude Code, Claude Desktop, Cursor, VS Code) and how to get a token.
| Variable | Default | |
|---|---|---|
KAITEN_API_BASE_URL |
http://localhost:6060/api |
Kaiten's gateway: it is what accepts a ksh_ token. Not the API container |
KAITEN_API_TOKEN |
The token for stdio, or for an HTTP request that brings none | |
KAITEN_MCP_READ_ONLY |
false |
Register read tools only (also --read-only) |
MCP_HOST / MCP_PORT |
0.0.0.0 / 8000 |
HTTP listener |
MCP_ALLOWED_HOSTS / MCP_ALLOWED_ORIGINS |
Comma-separated allowlists for the HTTP transport's Host/Origin check. Without them, the check applies when bound to localhost only | |
KAITEN_API_TIMEOUT |
30 |
Seconds per API call |
GET /health reports the server's version and whether Kaiten's gateway answers.
Development
uv sync
uv run ruff check . && uv run ruff format --check .
uv run pytest # unit tests: the real SDK over a mocked Kaiten
tests/e2e drives every tool through a real MCP client against a live Kaiten. With
Kaiten's own stack and its demo dataset (task quickstart, which
seeds the Kaiten Sushi Shop), and a token with read:* and write:* on that organization:
KAITEN_API_BASE_URL=http://localhost:6060/api KAITEN_API_TOKEN=ksh_... uv run pytest -m e2e
It creates everything it needs under a run-unique suffix and deletes it afterwards, except one service
account (e2e-mcp): Kaiten has no way to delete one.
License
The Kaiten MCP server is open source and licensed under the Apache License, Version 2.0.
By contributing, you agree to certify your contribution under the Developer Certificate of Origin 1.1.
The Kaiten name and logos are not licensed under Apache-2.0. See the Kaiten trademark policy.
Metadata
Release files for kaitencloud-mcp 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| kaitencloud_mcp-0.2.0.tar.gz | 120.6 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| kaitencloud_mcp-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 172.3 kB
Release files / kaitencloud_mcp-0.2.0.tar.gz
| Download URL | kaitencloud_mcp-0.2.0.tar.gz |
|---|---|
| Size | 120.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2166fb4a3638a2d63dcc37c822639ef2e3981c1bf58f8645a9ac2d518b89a251
|
|
BLAKE2b-256 checksum How to use checksums |
c2e84c5bb830fc155fa9a90b04055435aed09277fad78fd2917706a218e2ed39
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logRelease files / kaitencloud_mcp-0.2.0-py3-none-any.whl
| Download URL | kaitencloud_mcp-0.2.0-py3-none-any.whl |
|---|---|
| Size | 51.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b7fbc8d00e7591d2931798274adf2dbae71c9b9f0b0885569bee87097eefba5c
|
|
BLAKE2b-256 checksum How to use checksums |
8559ea8055f5e89fbb2aefbf7b6aa0c89a0c5f23043816ffb3def309b8489ee8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logSecurity for kaitencloud-mcp 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for kaitencloud_mcp-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.