MCP server
kaja mcp serves your Kaja organization to an MCP client over stdin and stdout. Clients that speak
the Model Context Protocol — Claude Code, Claude Desktop, and others — can then answer questions
about what you have deployed without you pasting console output into a chat.
It is read-only by design. There is no tool that deploys, deletes, or returns a secret's value.
Requirements
The CLI, signed in:
curl -sfL https://kaja.dev/cli.sh | sh
kaja auth login
The MCP server reuses that session. It does not hold its own credential, which also means it inherits the session's 24-hour expiry — see Sessions and limits below.
Register it with a client
With Claude Code:
claude mcp add kaja -- kaja mcp
Any other client takes the same two pieces: the command is kaja, the argument is mcp. A client
that wants JSON configuration usually expects something of this shape:
{
"mcpServers": {
"kaja": {
"command": "kaja",
"args": ["mcp"]
}
}
}
Use an absolute path to the binary if the client does not inherit your shell's PATH. which kaja
will tell you where the install script put it.
Nothing listens on a port. The client starts the process and talks to it over stdin and stdout, so there is no endpoint to expose and nothing to firewall.
What the agent can see
| Tool | What it returns |
|---|---|
whoami | The account the server is authenticated as, and the console it talks to. |
list_organizations | Organizations this account belongs to, with the ids other tools accept as orgId. |
list_clusters | The clusters in the organization, and whether each one's agent is connected. |
list_projects | Projects in the organization. |
get_project | One project by name, plus how many resources inside it need attention. |
list_apps | Container apps in a project, with the image and status of each. |
get_app | One app in detail: image, replicas, ports and resources. |
list_deployments | An app's published revisions, newest first — what image each shipped, when, and who published it. |
list_services | Managed services installed in a project. |
get_service | One service in detail, including the environment variable names an app receives when it binds. Connection values are never returned. |
list_domains | Custom domains, with their DNS and certificate state. |
search_app_logs | An app's retained logs over a time window. |
Most tools are scoped by project name, so a conversation usually starts with list_projects. Calls
use the organization the CLI is logged into unless the agent passes orgId.
list_clusters is worth knowing about when something looks wrong: an agent that is not connected is
the usual reason resources sit in Applying or Unknown, because no change reaches that cluster
until it reconnects.
search_app_logs reads retained history, which requires the Observability service to be
installed on the cluster. Without it there is no store to search — see
Logs & metrics.
What it deliberately cannot do
- No writes. No deploys, no rollbacks, no restarts, no deletes, no configuration changes.
- No secret values. Secrets are not exposed by any tool. The console's own reveal is a separate, recorded permission and the MCP server does not have it.
- No shell. There is no terminal tool, because a shell inside a container would side-step every restriction above.
The reasoning is that an agent reading your infrastructure is a much easier thing to reason about than an agent changing it. If a write path arrives later it will be opt-in and say so.
Sessions and limits
Authentication is the CLI's session from kaja auth login, which the console expires after 24
hours. When it lapses, the tools start failing and you refresh it by running kaja auth login
again. That is workable for a session you started and are sitting next to. It is not suitable for an
unattended agent, and long-lived credentials for that case do not exist yet.
The agent sees exactly what your account sees. If your role is limited to one project, so is the agent. Registering the MCP server does not widen your access, and it does not narrow it either — so if you want an agent to see less, sign in as an account that can see less.
Troubleshooting
The client shows the server as failed. Run kaja mcp in a terminal. It prints the console it is
serving on stderr and then waits. If it exits complaining about login, run kaja auth login.
The client cannot find the command. Give it the absolute path from which kaja. GUI clients
frequently do not inherit the PATH your shell has.
Tools return nothing for a project you can see in the console. Check the organization with
whoami, and that the project name is the one in the URL rather than its display name.