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 44 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): the effective limit Kaiten enforces, the License's grant with the instance's add-ons, voucher boosts and entitlement exception applied. - 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. Kaiten Cloud's webhook routes are in no OpenAPI document: the server calls them in the
shapes Kaiten's console sends, and carries the catalogue of the event types they subscribe to, read from the SDK's models, generated from
Kaiten's contract.
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 |
| Billing | kaiten_get_billing · kaiten_get_prices · kaiten_get_invoices |
kaiten_save_prices · kaiten_subscribe_instance · kaiten_cancel_subscription · kaiten_set_instance_addon · kaiten_save_voucher · kaiten_redeem_voucher · kaiten_mark_invoice_paid |
| 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 |
| Webhooks | kaiten_get_webhooks |
kaiten_save_webhook · kaiten_delete_webhook (previews unless confirm=true) |
| 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.
The billing tools need billing to be on for the organization: kaiten_get_billing says whether it is, and
why not, and the others answer with that explanation rather than a bare 403. A voucher's code is a secret:
answers show its last four characters (code_hint), and the full code only in the answer of
kaiten_save_voucher that creates it, where the caller just gave it. Each tool names the scopes it needs in
its description:
| Billing tool | Scopes |
|---|---|
kaiten_get_billing |
read:billing; read:addons and read:vouchers for what is on sale; read:instances and read:voucher_redemptions for an instance |
kaiten_get_prices |
read:licenses |
kaiten_get_invoices |
read:billing |
kaiten_save_prices |
write:licenses |
kaiten_subscribe_instance |
write:billing, read:instances, read:licenses |
kaiten_cancel_subscription |
write:billing, read:instances |
kaiten_set_instance_addon |
write:instances |
kaiten_save_voucher |
write:vouchers; read:licenses to restrict it to License versions |
kaiten_redeem_voucher |
write:voucher_redemptions |
kaiten_mark_invoice_paid |
write:billing |
Webhooks are part of Kaiten Cloud, for an organization whose Kaiten License grants webhook events; the tools
need read:webhooks and write:webhooks. Where they are not served, the tools say why, and point a
self-hosted Kaiten to its event stream, which
carries the same event types. kaiten_get_webhooks(events="warning threshold") finds a type from the
catalogue on any edition, and kaiten_save_webhook shows a new endpoint's signing secret in the answer that
creates it, and nowhere else.
A webhook URL can be a credential as well: a Slack incoming-webhook URL is one. Answers show its scheme and
host only, https://hooks.slack.com/…, never its path, query or user info, and a receiver's response is shown
with that path taken out. Endpoints on one host are told apart by their id, which kaiten_delete_webhook
takes; kaiten_save_webhook and kaiten_delete_webhook also take the full URL, and match it without showing
it.
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.3 stdio
docker run -p 8000:8000 -e KAITEN_API_BASE_URL=... ghcr.io/kaitencloud/kaiten-mcp:0.3 # 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 only; never used for HTTP requests | |
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.
HTTP API calls require the caller's own nonempty Authorization: Bearer ksh_... header. Missing,
empty or malformed credentials fail before any API call; KAITEN_API_TOKEN is never an HTTP fallback,
even on a single-user server. Existing headerless HTTP clients must start sending a token or use stdio.
Kaiten's gateway validates the caller's token and scopes; a 401 or 403 is never retried with a process
credential. MCP initialization and tool discovery remain public, as does /health. Host/Origin
allowlists protect the transport but do not authenticate callers; use TLS for remote connections.
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 but the billing and webhook ones through a real MCP client against a
live Kaiten: a subscription and its invoices can never be deleted, only Kaiten Cloud serves webhooks,
and the suite cleans up after itself. 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.3.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 | Actions |
|---|---|---|---|---|
| kaitencloud_mcp-0.3.0.tar.gz | 153.7 kB | With provenance | Details for kaitencloud_mcp-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| kaitencloud_mcp-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for kaitencloud_mcp-0.3.0-py3-none-any.whl |
Total release size: 225.8 kB
Release files / kaitencloud_mcp-0.3.0.tar.gz
| Download URL | kaitencloud_mcp-0.3.0.tar.gz |
|---|---|
| Size | 153.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b8510276fd267b82de51b230577c5329347166eca9774b74078dc3deac838374
|
|
BLAKE2b-256 checksum How to use checksums |
423d4abffa7a54a6ac6d42ca1fce0bd16022774c7a64583cd4a7dfe507cd9703
|
| 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 Nov 2, 2026.
Transparency logRelease files / kaitencloud_mcp-0.3.0-py3-none-any.whl
| Download URL | kaitencloud_mcp-0.3.0-py3-none-any.whl |
|---|---|
| Size | 72.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9c2ee999dc3053ca10504f97449727621bf446a7a6ba8188733daaf6f7b47df6
|
|
BLAKE2b-256 checksum How to use checksums |
b147e3dea15d410ffe923e386510f9dfe840ee24e2f55c4fc7619faf14063dbc
|
| 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 Nov 2, 2026.
Transparency logSecurity for kaitencloud-mcp 0.3.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.3.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 Nov 2, 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.