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

ToolWhat it returns
whoamiThe account the server is authenticated as, and the console it talks to.
list_organizationsOrganizations this account belongs to, with the ids other tools accept as orgId.
list_clustersThe clusters in the organization, and whether each one's agent is connected.
list_projectsProjects in the organization.
get_projectOne project by name, plus how many resources inside it need attention.
list_appsContainer apps in a project, with the image and status of each.
get_appOne app in detail: image, replicas, ports and resources.
list_deploymentsAn app's published revisions, newest first — what image each shipped, when, and who published it.
list_servicesManaged services installed in a project.
get_serviceOne service in detail, including the environment variable names an app receives when it binds. Connection values are never returned.
list_domainsCustom domains, with their DNS and certificate state.
search_app_logsAn 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.