MCP server
An agent holds a token and is therefore a principal like any other: it acts as its owner, is bounded by their live grants, and its actions land in the audit log under their name (R-262).
Connecting#
pando mcp speaks MCP over stdio. In Claude Code:
claude mcp add pando -- pando mcpOr, by hand, in an MCP client's configuration:
{
"mcpServers": {
"pando": {
"command": "pando",
"args": ["mcp"],
"env": {
"PANDO_SERVER": "https://pando.example.com",
"PANDO_TOKEN": "tok_…"
}
}
}
}Tools#
One tool per endpoint, deliberately. A tool that composed several calls would be a capability the CLI and console do not have. Exec, reading a secret's value, changing grants or policy, and deleting a user are not offered: host policy is the boundary (O-12), and offering a tool policy will refuse wastes the agent's turn.
| Tool | What it does | Arguments |
|---|---|---|
pando_list_apps |
List the apps you can manage, with their current state. | none |
pando_get_app |
Get one app: its name, source, state and pinned spec. | app_id |
pando_create_app |
Create an app from a git repository. Returns immediately with the app in draft while Pando works out how to run it; call pando_get_detection next. | name, ref (optional), source_url |
pando_get_detection |
What Pando worked out about an app, including any questions it needs answered before it can deploy. The questions are written to be answerable by whatever wrote the app. | app_id |
pando_answer_detection |
Answer one of the questions from pando_get_detection. | answer, app_id, key |
pando_accept_proposal |
Accept what Pando worked out and pin it as the app's setup, optionally setting environment variables in the same step. This does not deploy — call pando_deploy after. | app_id, values (optional) |
pando_plan |
Show what a deploy would do, without doing it. Side-effect free, so it is safe to call after any change to check the change is deployable. | app_id |
pando_deploy |
Deploy an app. Returns once the deployment has been accepted, not once it is running. | app_id, idempotency_key (optional) |
pando_get_logs |
Read an app's recent logs. An app can be made of several parts — a web service, a worker, a database it brought with it — and each has its own log. Without workload this is the primary part, the one the app's address resolves to; pando_get_status lists the names. |
app_id, workload (optional) |
pando_stop_app |
Stop an app without deleting it. Its storage, configuration and address are kept, and it stays stopped until something starts it again. | app_id |
pando_start_app |
Start an app that was stopped, bringing back the version that was running. | app_id |
pando_restart_app |
Restart an app's workloads in place. Nothing is rebuilt and nothing is re-read — the same version, started again. | app_id |
pando_set_app_icon |
Set the image shown on an app's launcher tile. The image is a PNG, JPEG, WebP or GIF file of at most 256 KB, base64-encoded. SVG is not accepted. | app_id, image_base64 |
pando_clear_app_icon |
Remove the image on an app's launcher tile, so the tile shows the map generated for it. | app_id |
pando_favorite_app |
Pin an app to the top of your own launcher. It grants nothing and only you see it; you must be able to open the app. | app_id |
pando_unfavorite_app |
Unpin an app from your launcher. | app_id |
pando_rename_app |
Change an app's display name. Its ID and address do not change. | app_id, name |
pando_list_my_apps |
The apps you can open — your launcher — with which are favorites and which of your sections each is filed under, and your sections. A different list from pando_list_apps, which is the apps you can administer. | none |
pando_create_section |
Make a section in your own launcher: a named grouping of apps. Only you see it. | name |
pando_list_user_apps |
The apps an account has access to: its role for managing each, directly or through a group, whether it can use each, and whether you can change that (can_manage). | user_id |
pando_rename_section |
Rename one of your launcher sections. | name, section_id |
pando_delete_section |
Delete one of your launcher sections. Its apps go back to Your apps; nothing else changes. | section_id |
pando_add_app_to_section |
Move an app you can open into one of your launcher sections, out of any other. | app_id, section_id |
pando_remove_app_from_section |
Move an app out of one of your launcher sections, back to Your apps. | app_id, section_id |
pando_list_audit |
Read the audit log, newest first. Every filter is optional and they combine: what was done (an action prefix such as app. or grant.delete), who did it, which app, what it was done to, and when (RFC 3339 times; since inclusive, until exclusive). | action (optional), app_id (optional), before (optional), involving (optional), principal_id (optional), principal_kind (optional), since (optional), target_id (optional), target_kind (optional), until (optional) |
pando_get_config |
The configuration the Pando server started with: every non-secret setting, its value and where it was set (an environment variable, the config file, or the default), and the host policy fields fixed there, which cannot be changed through the API while they are set. | none |
pando_get_status |
What an app is doing right now: running, degraded, failed, and why — including each part separately, so a single part that is crash-looping is visible rather than averaged into one word for the app. | app_id |
pando_get_usage |
What each part of an app is using right now: CPU (thousandths of a core), memory and disk in bytes, and each mounted volume's size, beside its limits (0 means none). A reading, not a history. | app_id |