MCP server
117 tools. Add Pando to an MCP client by its MCP address, then approve the client in the browser window it opens. The client acts with the permissions of the account that approves it. The address is under API and tools in the console.
In Claude Code:
For a client that can't sign in through a browser, create a token under API and tools and send it in the Authorization header as Bearer tok_….
To run the server on your own machine over stdio, install the CLI:
pando_accept_proposal
Accept what Pando worked out and pin it as the app's setup, optionally setting environment variables and secrets in the same step. This does not deploy — call pando_deploy after. On an app that is already configured it is refused unless confirm is true: accepting again replaces how the app is built and what it runs with what detection found, and carries over variables, how each dependency is filled, and storage. pando_get_detection_diff shows what would change. To change only a variable on a configured app, write a spec revision with pando_create_spec instead.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
confirm | boolean | true to accept over an app that is already configured. |
hostname | string | The address to serve the app at, where its routing gives it a hostname of its own. |
optional | string[] | Dependencies the app runs without, by their keys. |
secrets | object | Secret variables to set, name to value. Stored by the secrets adapter; needs app.secrets.write. |
values | object | Environment variables to set, name to value, e.g. {"API_URL": "https://api"}. Stored as ordinary variables, not secrets. |
pando_add_app_to_section
Move an app you can open into one of your launcher sections, out of any other.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
section_idRequired | string | The section's ID. |
pando_add_webhook_route
Let a verified delivery with no Pando credential reach one method and exact path of an app, which otherwise stays private. With kind hmac_sha256, header holds the hex HMAC-SHA256 of the body after any prefix, and a signature already accepted is not forwarded again unless allow_repeats is set. With kind header, header holds the secret itself. Without secret, one is generated and returned this once. Saved as a new configuration that takes effect at the app's next deploy.
| Argument | Type | Description |
|---|---|---|
allow_repeats | boolean | With hmac_sha256: turn the replay check off, for a sender that repeats identical bodies. |
app_idRequired | string | The app's ID. |
headerRequired | string | The header holding the signature or the secret, such as X-Hub-Signature-256. |
kindRequired | "hmac_sha256" | "header" | |
methodRequired | "POST" | "PUT" | "PATCH" | |
nameRequired | string | The route's name: lowercase letters, digits and hyphens, such as noodle. |
pathRequired | string | The exact path the app receives, such as /api/v1/webhook/noodle. |
prefix | string | With hmac_sha256: what comes before the signature, such as sha256=. |
secret | string | The secret the provider issued. Left out, one is generated. |
pando_ai_ask_reference
Ask how to do something with Pando. Answered from Pando's API, CLI and MCP reference, citing the endpoints, commands and tools it relies on. Describes; does nothing.
| Argument | Type | Description |
|---|---|---|
questionRequired | string | What you want to do. |
pando_ai_draft_access
Draft a custom role and a group from a description of who should be able to do what. A draft only: nothing is created. Verbs come from Pando's catalog; anything else is listed as refused.
| Argument | Type | Description |
|---|---|---|
descriptionRequired | string | Who should be able to do what, in a sentence or two. |
pando_ai_draft_host_rules
Propose changes to the installation's host policy from a description: the document as it would be saved, and each change. Nothing is saved. Settings fixed in the startup configuration are declined, naming where they are set.
| Argument | Type | Description |
|---|---|---|
descriptionRequired | string | What the rules should be, in a sentence or two. |
pando_ai_search_audit
Ask a question of the audit log, such as "which apps did Ben Meeker create last month?". Returns a short summary and the filters used, which pando_list_audit takes as-is.
| Argument | Type | Description |
|---|---|---|
questionRequired | string | The question. |
pando_answer_detection
Answer one of the questions from pando_get_detection. An answer that changes what is built (a build argument) has Pando build and scan the image again, so the plan shows the score of what will run: detection reads as running until it has, and accepting waits for it.
| Argument | Type | Description |
|---|---|---|
answerRequired | string | The answer. |
app_idRequired | string | The app's ID. |
keyRequired | string | The question's key. |
pando_approve_deploy
Approve a deploy that is waiting for approval. When it is the last approval the deploy needs, the deploy starts. Approval is a person's sign-off, so by default an installation does not let an agent's token approve; the refusal says so.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
comment | string | Optional. A note recorded with the approval. |
deployment_idRequired | string | The deploy's ID, as pando_list_approvals or pando_deploy returned it. |
pando_assign_ai_function
Have an AI adapter handle one AI function, optionally on a model of its own. Refused while another adapter handles the function; unassign it there first.
| Argument | Type | Description |
|---|---|---|
adapter_idRequired | string | The AI adapter's ID, such as ai_anthropic. |
functionRequired | string | The AI function, such as search_audit. pando_list_ai_functions lists them. |
model | string | A model for this function only. Omit to use the adapter's own. |
pando_check_app_image
For an app deployed from a published image: whether its tag, such as :latest, now names a different build than the one the app runs. Writes nothing. When update_available is true, pando_deploy_newer_image with latest_digest deploys that build.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_check_updates
Ask GitHub for Pando's releases now rather than waiting for the six-hourly check, and answer as pando_get_updates does. A second request within a minute answers from the first. Sends nothing while host policy's disable_update_check is set.
pando_clear_app_icon
Remove the image on an app's launcher tile, so the tile shows the map generated for it.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_configure_adapter
Add an adapter, or change one by its id. Settings go in config; a secret such as an API key or a registry password goes in credentials, which is stored encrypted and never shown again. A source connection or an image registry is used from the moment it is saved; any other adapter after Pando restarts. enabled: false turns one off.
| Argument | Type | Description |
|---|---|---|
categoryRequired | string | The category, such as image_registry, as pando_list_adapter_kinds lists it. |
config | object | The kind's settings, by key. |
credentials | object | The kind's secret settings, by key. A key sent empty removes that credential. |
enabled | boolean | false turns it off. Left out, it is on. |
idRequired | string | The adapter's id, such as reg_main. An existing id changes that adapter. |
is_default | boolean | Make it the default in its category, in place of the current default. The result's replaced_default names that adapter and handover says what changes; tell the person both. |
kindRequired | string | The kind within the category, such as oci or ecr. |
name | string | A name for people to read. |
pando_connect_notify
Connect a notification adapter such as Slack to its provider. mode web takes token, a Slack configuration token (Slack's app settings, Your App Configuration Tokens, Generate Token) used once and never stored; Pando creates its app and returns authorize_url for the person to open in a browser signed in to Pando and choose Allow. Slack returns only to an https address. mode manual without token returns authorize_url, which creates the app in Slack by hand; with token, the bot token it shows once installed, it finishes. Check pando_list_notify_adapters afterwards.
| Argument | Type | Description |
|---|---|---|
adapter_idRequired | string | The adapter's ID, from pando_list_notify_adapters. |
mode | string | web (the default) or manual. |
token | string | For web, a Slack configuration token; for manual, the app's bot token, or omit for the link. |
pando_count_unread_notifications
How many of your notifications are unread, without listing them.
pando_create_app
Create an app from a git repository (source_url), from an image that is already built (image), or from files you will send next (upload: true, then pando_upload_source). Give exactly one. Returns immediately with the app in draft while Pando works out how to run it; call pando_get_detection next, with wait_seconds to wait for it to finish. For an upload, detection starts when pando_upload_source is followed by pando_rerun_detection.
| Argument | Type | Description |
|---|---|---|
connection | string | Optional, with source_url: the source connection (from pando_list_sources) to read a private repository with. Left out, the one covering the URL is used. |
image | string | An image reference such as ghcr.io/acme/web:1.4, run as it is. |
nameRequired | string | A short name for the app. |
ref | string | Branch or tag. Optional, with source_url. |
registry_credential | object | Optional, with image: the credential a private image is pulled with. Either kind basic with username and password (a token that can read the image), or kind ecr with access_key_id, secret_access_key and optionally region, for AWS ECR. |
source_url | string | The repository URL. |
upload | boolean | True to create the app for files sent with pando_upload_source. |
pando_create_join_token
Create a token a new Pando joins this installation with, at its setup. join in the reply is the token and is shown once. A token for the control role needs every install permission.
| Argument | Type | Description |
|---|---|---|
address | string | The installation's address the joining host reaches, such as https://pando.example.com. Left out, this server's advertise address. |
expires_hours | integer | How many hours it lasts. Left out, 24. |
max_uses | integer | How many hosts may join with it. Left out, 1. |
roles | string[] | control, app, or both. Left out: both while the cluster has fewer than three hosts, then app. |
pando_create_section
Make a section in your own launcher: a named grouping of apps. Only you see it.
| Argument | Type | Description |
|---|---|---|
nameRequired | string | The section's name. |
pando_create_spec
Write a new spec revision: the way to change a configured app's variables, egress, workloads or anything else in its spec. Send the whole spec — read the pinned one with pando_get_spec, change it, and send it back. Revisions are append-only, and this neither pins nor deploys: call pando_pin_spec with the revision it returns, then pando_deploy. With dry_run true nothing is written; the reply says whether the spec is accepted, the egress rules it would run with, and whether deploying it would need approval.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
dry_run | boolean | true to check the spec without writing it. |
specRequired | object | The whole spec, as pando_get_spec returns it under body. |
pando_create_subscription
Subscribe to events and send them to a webhook (url) or through a notification adapter such as Slack or email (adapter_id). events is a comma-separated list of event names, prefixes such as deploy.*, or *; pando_list_events lists them. With app_id it is about one app; without, it is install-wide and needs install.events.manage. A webhook's signing key is in the result once; tell the person to keep it.
| Argument | Type | Description |
|---|---|---|
adapter_id | string | A notification adapter's ID. Give this or url. |
app_id | string | The app. Omit for install-wide. |
channel | string | The channel it posts to, for an adapter whose destination says channels, such as Slack; pando_list_notify_channels lists them. |
content_type | string | A webhook's content type. Optional; application/json by default. |
description | string | What the subscription is for. Optional. |
eventsRequired | string | Comma-separated event names or patterns, such as deploy.failed,app.state_changed. |
headers | string | A webhook's own headers, one "Name: value" per line, such as an Authorization its receiver needs. Optional. |
method | string | A webhook's HTTP method: POST, PUT or PATCH. Optional. |
payload_template | string | A webhook's body as a Go template, such as {"text": {{json .Subject}}}. Optional; Pando's envelope by default. |
url | string | The webhook URL to post to. Give this or adapter_id. |
pando_delete_secret
Remove one of an app's secrets. Needs app.secrets.write.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
keyRequired | string | The secret's name. |
pando_delete_section
Delete one of your launcher sections. Its apps go back to Your apps; nothing else changes.
| Argument | Type | Description |
|---|---|---|
section_idRequired | string | The section's ID. |
pando_delete_subscription
Delete a subscription, its signing key and its delivery log.
| Argument | Type | Description |
|---|---|---|
subscription_idRequired | string | The subscription's ID. |
pando_deploy
Deploy an app. Returns once the deployment has been accepted, not once it is running. Without spec_revision it ships the pinned revision; an edit, from the console or pando_create_spec, writes a newer one, and the reply's newer_revision names it — deploy again with that revision to ship the edit. When the deploy needs somebody's approval, it comes back with status awaiting_approval and approval_reasons saying why; it runs once a person approves it.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
idempotency_key | string | A key you choose. Retrying with the same key will not deploy twice. |
spec_revision | integer | The revision to deploy, by number, such as the newest from pando_list_specs. Left out, the pinned one. |
pando_deploy_newer_image
Deploy the newer build pando_check_app_image found: writes a revision pinning digest and deploys it. Refused if the tag has moved since the check; check again then. Answers as pando_deploy does, approval included.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
digestRequired | string | The latest_digest from pando_check_app_image. |
pando_diff_specs
Compare two spec revisions: what changed, and whether deploying it restarts, rebuilds or leaves the app alone.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
fromRequired | string | The earlier revision, by number or ID. |
toRequired | string | The later revision, by number or ID. |
pando_edit_role
Rename a custom role, replace its permissions, or both. The verbs must be of the role's scope; built-in roles cannot be changed. Changing an installation role needs every installation permission it carries before and after; permissions added to an app role must be yours on every app it is granted on. Needs install.users.manage.
| Argument | Type | Description |
|---|---|---|
name | string | The new name. Leave out to keep it. |
role_idRequired | string | The role's ID. |
verbs | string[] | Every permission the role carries, from the verb catalog. Leave out to keep them. |
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.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_get_address
Where an app is reached: its routing (adapter, mode, hostname, path or port) and address, next_address when a change is saved and not yet deployed, and the routing adapters it could move to — each with the modes it serves, its default mode, base_domain, and domains: every domain a hostname can be in, such as each of a Cloudflare adapter's zones.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_get_app
Get one app: its name, source, state and pinned spec. Once the app has been through detection, detection says where that has got to — status, and stage while it is running — which is why an app in draft is still in draft.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_get_app_idle
When Pando stops or deletes an app nobody uses: the app's own stop_days and delete_days (null is the installation's, 0 is never), the installation's, the ones in force, last_activity_at, stops_at and deletes_at if nobody uses it before then, and stopped_for_idle when Pando stopped it.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_get_app_limit
How many apps a person may own. With user_id: the limit in force (0 is unlimited), where it comes from (user, group or policy, with the group's name), how many apps they own, and the value on their own account. With group_id: the group's max_apps, null when it sets none. Your own account needs no permission; anything else needs install.users.manage.
| Argument | Type | Description |
|---|---|---|
group_id | string | A group's ID. Give this or user_id. |
user_id | string | An account's ID. Give this or group_id. |
pando_get_auto_deploy
Whether an app deploys automatically when its repository changes, and how: settings on the newest configuration and deployed on the running one, with pending when they differ; paused when approval now stops it; last_check, what Pando last found and the last commit it tried (each commit is tried once) and why it went nowhere; and the webhook URL, with whether a webhook secret is set.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
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.
pando_get_delivery
One delivery: every attempt at it, with the status code and error each got, and the payload sent.
| Argument | Type | Description |
|---|---|---|
delivery_idRequired | string | The delivery's ID, dlv_…. |
subscription_idRequired | string | The subscription's ID. |
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. status is running while Pando is still working: call again. While running, stage says what it is doing — fetching (cloning the repository), detecting (working out what the app is), building (building the image the app would run, so the plan can show its security score), trying (a trial run), scanning (a security scan) or screening (an AI adapter checking the plan); running lists every step under way, since the scan runs beside the build and the trial; and elapsed_seconds says how long it has taken so far; a build or a trial run can take several minutes. Pass wait_seconds (up to 60) to have the call return as soon as the stage changes or detection finishes, instead of calling repeatedly. When it has finished, status is ready (call pando_accept_proposal), needs_answers or unknown (answer the questions with pando_answer_detection), blocked or failed (the detection field says why).
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
wait_seconds | integer | Optional. While detection is running, wait up to this many seconds (at most 60) for it to move on before answering. 0 or absent answers at once. |
pando_get_detection_diff
What accepting the proposal would change about the app's pinned configuration: each change with its class (benign, restart, rebuild or destructive) and a summary. is_first is true when the app is not configured yet, so everything is new.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_get_instructions
The instructions every agent building on this installation follows: Pando's guidance for writing apps that run well and safely here, then this organization's own rules and preferences, which win where the two differ. Read them before writing or changing an app if the client did not load them when it connected. text is the whole document.
pando_get_last_upgrade
The most recent in-place upgrade of Pando: from and to which version, whether it succeeded or was rolled back and why, with the new version's last log lines when it was.
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. Returns the most recent lines: 200 unless tail says otherwise, and never more than 5000.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
tail | integer | Optional. How many of the most recent lines to return, 1 to 5000. Defaults to 200. |
workload | string | Which part of the app to read. Defaults to the primary one. |
pando_get_notification_preferences
Which of Pando's own notifications reach you, on each channel that reaches people, such as the console and email.
pando_get_registry_credential
Whether an image app has a registry credential, and of which kind, with its username or access key ID. Never the password or secret key.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_get_spec
Read one spec revision in full: how the app is built, what it runs, its variables, egress and routing.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
revisionRequired | string | The revision number, such as "3", or the revision's ID. |
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.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_get_two_factor
Who you are (GET /me), including, on a local account, two_factor: whether two-factor authentication is on, whether host policy requires it, and how many recovery codes are left. Setting it up or changing it is done in the console's settings or with pando two-factor, never here: each step handles an authenticator key, recovery codes or your password.
pando_get_updates
Whether a newer Pando is released: the version the server runs, the latest on the update channel, and each version in between with its changelog, security fixes and breaking changes marked, plus the command that upgrades the server. The check is host policy (disable_update_check, update_channel).
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.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_get_user
One account, with every installation role it holds and where each comes from (install_roles), as pando_list_users shows it. Your own needs no permission; anyone else's needs install.view.
| Argument | Type | Description |
|---|---|---|
user_idRequired | string | The account's ID. |
pando_ignore_notice
Hide one of an app's notices from yourself until what it says changes. Only you: everyone else still sees it. It hides a reminder and nothing more — a deploy the notice warned about is still refused.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
keyRequired | string | The notice's key, as pando_list_notices lists it, such as variables.unset. |
pando_list_adapter_kinds
The kinds of adapter this build of Pando can run, and the settings each takes: which are credentials, which are required, and the default each takes when left out.
pando_list_adapters
The adapters this installation is configured with — runtimes, routing, builders, image registries, secrets, backup, scanners, AI, source connections and the rest — each with its live capabilities, whether it is reachable, which credentials are set (never their values), and whether it waits on a restart. One declared at startup is read-only.
pando_list_ai_functions
Each AI function Pando has, the AI adapter that handles it and on which model, whether it is on, and whether the startup configuration assigns it.
pando_list_app_events
An app's recent events, newest first: deploys, state and health changes, scans, shares, backups. Each says what happened in a sentence.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_list_approvals
List the deploys waiting for approval on every app you can see. Each says which app, why it needs approval, the approvals it has so far, and can_decide: whether you may approve or reject it. Oldest first, a page at a time: pass next_cursor back as cursor for the next page.
| Argument | Type | Description |
|---|---|---|
cursor | string | The next_cursor from a previous page. |
decidable | boolean | true to list only the deploys you may approve or reject. |
pando_list_apps
List the apps you can manage, with their current state, newest first, a page at a time. Each app has its address, its owner's name (owner_name), and access, who can open it: private (its owner alone), shared (its owner and the people or groups it is shared with), public (anyone on the internet, without signing in) or passcode (anyone on the internet who has the passcode). notice_count is how many of its notices you have not ignored (pando_list_notices lists them), left out when none. total is how many match; pass next_cursor back as cursor for the next page.
| Argument | Type | Description |
|---|---|---|
cursor | string | The next_cursor from a previous page. |
q | string | Only apps whose name or slug contains this. |
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, how it ended, text to search for, and when (RFC 3339 times; since inclusive, until exclusive). Each event has a summary in plain words, such as "Deployed crewmate", beside its action.
| Argument | Type | Description |
|---|---|---|
action | string | Actions starting with this, e.g. app. |
app_id | string | Events on this app. |
before | string | The next_before from a previous page, to read further back. |
involving | string | Events where this ID is the actor or the target: everything to do with one account. |
outcome | string | Only events with this outcome: success, denied or failed. |
principal_id | string | Who did it: a user or token ID, or system, reconciler or detection. |
principal_kind | string | What kind of actor: user, token, system or anonymous. |
q | string | Text found in the action, the actor's name, email or ID, the target's ID, or the app's ID or name. |
since | string | From this time, RFC 3339. |
target_id | string | The ID of the thing it was done to. |
target_kind | string | What kind of thing it was done to, e.g. user, role, app. |
until | string | Up to this time, RFC 3339. |
pando_list_audit_archives
The months of the audit log past retention, archived and removed from the live log: each month's row count, first and last event, time range, size, SHA-256 digest, and where it is kept. Events in these months are not in pando_list_audit; the archive itself is a gzip download from GET /api/v1/audit/archives/{id}, or pando audit archives download.
pando_list_audit_sinks
The audit sinks: destinations, such as a SIEM's syslog or HTTPS collector, that the audit log is pushed to as it is written. Each with what it sends where (transport, endpoint, format, actions, exclude, and disclosure, the sentence saying what leaves the installation), its last delivery, backlog, last_error and failing_since, why Pando turned it off if it did, and gap_from and gap_to for a range of events it missed. Needs install.audit.read.
pando_list_deliveries
A subscription's recent deliveries, newest first: each event, whether it arrived, how many attempts it took, and the last error.
| Argument | Type | Description |
|---|---|---|
subscription_idRequired | string | The subscription's ID. |
pando_list_events
List the events a subscription can name: each event's name, whether it is about one app or the whole installation, and its data fields.
pando_list_hosts
The hosts that have joined this installation's cluster: each one's name, roles (control, app), address, version and when it was last heard from. Needs install.cluster.manage.
pando_list_join_tokens
Every join token, newest first: its roles, how many of its uses are spent, when it expires and whether it was revoked. Never the token itself. Needs install.cluster.manage.
pando_list_my_apps
The apps you can open — your launcher — with which are favorites, which of your sections each is filed under, and whether you can also manage it (can_manage), and your sections. Favorites first, then filed apps, then the rest, a page at a time: pass next_cursor back as cursor for the next page. A different list from pando_list_apps, which is the apps you can administer.
| Argument | Type | Description |
|---|---|---|
cursor | string | The next_cursor from a previous page. |
q | string | Only apps whose name or slug contains this. |
pando_list_notices
What an app's Overview asks of somebody: a configuration not yet deployed, variables with no value, a backup that was not taken, a security score below this installation's minimum, the spec's warnings. Each has a stable key, a message, a fingerprint and whether you have ignored it as it reads now.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_list_notifications
Your notifications inbox, newest first, and how many are unread. unread=true lists only those.
| Argument | Type | Description |
|---|---|---|
unread | string | true to list only unread notifications. Optional. |
pando_list_notify_adapters
List the notification adapters, each with whether it can send: capabilities.authorized, and problem saying why one cannot. One with web_authorization or manual_authorization that is not authorized, such as Slack, needs pando_connect_notify first.
pando_list_notify_channels
List the channels a subscription to a notification adapter such as Slack can post to: id, name, private. A private Slack channel is listed once Pando is invited to it with /invite @Pando.
| Argument | Type | Description |
|---|---|---|
adapter_idRequired | string | The adapter's ID. |
q | string | Only channels whose names contain this. Optional. |
pando_list_role_holders
Who holds a role: the groups granted it, then the accounts holding it, each with via — direct, or group for an account holding it only through a group. An app role's holders are those holding it on any app. A page at a time: pass next_cursor back as cursor. Needs install.view.
| Argument | Type | Description |
|---|---|---|
cursor | string | The next_cursor from a previous page. |
role_idRequired | string | The role's ID. |
pando_list_secrets
List which secrets an app has, and where each came from. Never their values.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_list_source_branches
The branches of a repository, read through a source connection.
| Argument | Type | Description |
|---|---|---|
source_idRequired | string | The connection's id, from pando_list_sources. |
urlRequired | string | The repository's URL. |
pando_list_source_repositories
The repositories a source connection can read, to pick one for pando_create_app rather than guess its URL. Refused for a connection with no API access, such as an SSH key.
| Argument | Type | Description |
|---|---|---|
query | string | Optional: only repositories whose name contains this. |
source_idRequired | string | The connection's id, from pando_list_sources. |
pando_list_sources
The installation's source connections: how Pando reads private repositories on GitHub, GitLab, Azure DevOps, Bitbucket, Gitea or any git host. Each has an id, the host and scope it covers, how it signs in, whether it can list repositories, and whether it is authorized; problem says why one cannot be used. A private repository is read with the connection that covers its URL.
pando_list_specs
List an app's spec revisions, and which one is pinned. The pinned revision is what runs and what the next deploy ships.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_list_subscriptions
List your event subscriptions: what each listens for, where it sends, and whether it is on. app_id narrows to one app. Newest first, a page at a time: pass next_cursor back as cursor for the next page.
| Argument | Type | Description |
|---|---|---|
app_id | string | Only subscriptions about this app. Optional. |
cursor | string | The next_cursor from a previous page. |
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). By app name, a page at a time: pass next_cursor back as cursor for the next page.
| Argument | Type | Description |
|---|---|---|
cursor | string | The next_cursor from a previous page. |
user_idRequired | string | The account's ID. |
pando_list_users
The accounts on this installation, newest first, a page at a time: pass next_cursor back as cursor for the next page. Each carries adapter_name — the identity provider it signs in with — and install_roles — every installation role it holds, and whether it holds it directly or through a group (with the group's name, and the identity provider for a synced group) — and install_role_id, the role granted to the account itself. Needs install.view.
| Argument | Type | Description |
|---|---|---|
cursor | string | The next_cursor from a previous page. |
q | string | Only accounts whose username, display name or email contains this. |
pando_list_webhook_routes
The webhook routes on an app's newest configuration: each one's name, method, path and verification, secret_set, without which it refuses every delivery, and deployed, whether the app runs it as it stands.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_mark_host_lost
Say a host is gone and start the standby of each app homed on it. With three or more hosts Pando does this itself when most of them cannot reach the host; with fewer it never does. Refused while the host answers. A failed app is not failed over. Returns the apps started and the ones skipped, with why. Needs install.cluster.manage.
| Argument | Type | Description |
|---|---|---|
host_idRequired | string | The host's ID, from pando_list_hosts. |
pando_mark_notifications_read
Mark one of your notifications read, by notification_id, or every one when it is omitted.
| Argument | Type | Description |
|---|---|---|
notification_id | string | The notification's ID, ntf_…. Omit to mark every one read. |
pando_pin_spec
Pin a spec revision: what the app converges to, and what the next deploy ships. This does not deploy — call pando_deploy after. On an app that has been deployed, pinning changes what it runs, so it needs app.deploy, and a revision whose deploy needs approval is refused: deploy it instead.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
revisionRequired | string | The revision number, such as "3", or the revision's ID. |
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.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_plan_upgrade
Whether Pando can upgrade itself in place to a version, and if not, every reason with what to change; which versions in between may break something, with their upgrade notes. Starting an upgrade is not offered here: it takes a backup passphrase, and agents do not hold install.upgrade by default.
| Argument | Type | Description |
|---|---|---|
versionRequired | string | The version to upgrade to, such as 0.4.0, from pando_get_updates. |
pando_read_audit_stream
Read the audit log in commit order, oldest first, one page at a time. Returns events, cursor and caught_up. Pass the cursor back as after to read on from where this page ended; keep it to ask later what has happened since. Without after it starts at the oldest event in the live log; after: "now" starts after the newest. caught_up says there is nothing past the cursor yet. Delivery is at least once: an event can come back again, and its id is the key to drop it by. Needs install.audit.read.
| Argument | Type | Description |
|---|---|---|
action | string[] | Optional. Only actions starting with one of these prefixes, such as grant. |
after | string | The cursor a previous page returned, or now. Optional. |
exclude | string[] | Optional. Leave out actions starting with one of these prefixes. |
format | string | Optional. native (the archive's line format, the default) or ocsf. |
limit | integer | Optional. How many events, 1 to 1000. Defaults to 500. |
pando_redeliver
Send a delivery again now, with the whole retry schedule ahead of it.
| Argument | Type | Description |
|---|---|---|
delivery_idRequired | string | The delivery's ID. |
subscription_idRequired | string | The subscription's ID. |
pando_reject_deploy
Reject a deploy that is waiting for approval. One rejection ends the request, and the deploy does not run. Approval is a person's sign-off, so by default an installation does not let an agent's token reject either.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
comment | string | Optional. Why, recorded with the rejection and shown to whoever asked. |
deployment_idRequired | string | The deploy's ID, as pando_list_approvals or pando_deploy returned it. |
pando_remove_app_from_section
Move an app out of one of your launcher sections, back to Your apps.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
section_idRequired | string | The section's ID. |
pando_remove_host
Remove a host from the cluster. The installation's first host and the host serving the request cannot be removed. For a host that held the control role, the answer's notice and rotate name the keys to replace. Needs install.cluster.manage.
| Argument | Type | Description |
|---|---|---|
host_idRequired | string | The host's ID, from pando_list_hosts. |
pando_remove_registry_credential
Remove an image app's registry credential, so its image is pulled anonymously.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_remove_webhook_route
Remove a webhook route. Its secret goes at once, so deliveries are refused from now on, and the route leaves the configuration at the app's next deploy.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
nameRequired | string | The route's name. |
pando_rename_app
Change an app's display name. Its ID and address do not change.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
nameRequired | string | The new name. |
pando_rename_group
Rename a group made in Pando. A group synced from an identity provider is renamed there. Needs install.users.manage.
| Argument | Type | Description |
|---|---|---|
group_idRequired | string | The group's ID. |
nameRequired | string | The new name. |
pando_rename_section
Rename one of your launcher sections.
| Argument | Type | Description |
|---|---|---|
nameRequired | string | The new name. |
section_idRequired | string | The section's ID. |
pando_rerun_detection
Work out again how to run an app, from its source as it is now: after pando_upload_source, after the repository changed, or after setting a registry credential for a private image. Nothing changes until the new proposal is accepted. Then call pando_get_detection with wait_seconds.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_reset_user_two_factor
Remove another local account's two-factor authentication — its authenticator and recovery codes — for someone who has lost both, and sign it out everywhere. They then sign in with their password alone, and set it up again if host policy requires it. Needs install.users.manage and every installation permission that account holds.
| Argument | Type | Description |
|---|---|---|
user_idRequired | string | The account's ID. |
pando_restart_app
Restart an app's workloads in place. Nothing is rebuilt and nothing is re-read — the same version, started again.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_restore_notice
Show one of an app's notices you ignored again.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
keyRequired | string | The notice's key, as pando_list_notices lists it, such as variables.unset. |
pando_revise_detection
Tell the install's AI adapter what is wrong with the plan from pando_get_detection, in plain words, e.g. "The app serves on port 8080." It checks the repository, changes what it can show, and replies; the reply, what it changed and what Pando refused are the last entry of detection.conversation. Needs an AI adapter.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
messageRequired | string | What is wrong with the plan. |
pando_revoke_join_token
Revoke a join token, so no host can join with it. Needs install.cluster.manage.
| Argument | Type | Description |
|---|---|---|
token_idRequired | string | The join token's ID, from pando_list_join_tokens. |
pando_set_address
Change where a configured app is reached. Everything left out keeps what the app has, or takes the adapter's default when moving to another adapter. To put the app in another of the adapter's domains (from pando_get_address), give domain: alone it makes <slug>.<domain>, and with a hostname that is a single name such as docs it makes docs.<domain>. This writes a spec revision and does not deploy; the next deploy moves the app, and the old address stops working then. Without confirm: true it changes nothing and the error says what would move where — tell the person before confirming. A mode the adapter does not default to needs app.routing.override.
| Argument | Type | Description |
|---|---|---|
adapter_ref | string | The routing adapter, such as rte_cloudflare. Optional; the app's current one. |
app_idRequired | string | The app's ID. |
confirm | boolean | true to make the change. Left out, nothing changes and the reply says what would. |
domain | string | With subdomain mode: which of the adapter's domains the hostname is in, such as example.org. Optional; the adapter's base domain. |
hostname | string | With subdomain mode: the hostname, such as notes.example.com, or with domain a single name such as notes. Optional. |
mode | "subdomain" | "path" | "port" | How the app is addressed. Optional. |
path_prefix | string | With path mode: the path, such as /team/notes. Optional. |
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.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
image_base64Required | string | The image file's bytes, base64-encoded. |
pando_set_app_idle
Set when Pando stops and deletes an app nobody uses. Both are replaced, so pass what pando_get_app_idle returned for the one you are not changing. Each is a number of days, "never", or "default" for the installation's setting. Both count from the last use, so deleting has to come later than stopping. App settings, not spec: nothing is deployed.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
delete_daysRequired | any | Days without use before Pando deletes the app, "never", or "default". |
stop_daysRequired | any | Days without use before Pando stops the app, "never", or "default". |
pando_set_app_limit
Set how many apps an account, or each person in a group, may own. A number, 0 for unlimited, or "clear" to remove it. An account's own value applies whatever its groups say; otherwise the most generous group's, then host policy's max_apps_per_user. Lowering it removes nothing. Needs install.users.manage, which host policy keeps from agents unless an administrator allows it.
| Argument | Type | Description |
|---|---|---|
group_id | string | A group's ID. Give this or user_id. |
max_appsRequired | any | A number of apps, 0 for unlimited, or "clear". |
user_id | string | An account's ID. Give this or group_id. |
pando_set_auto_deploy
Turn automatic deploys on or off for an app, and choose what deploys: each new commit on a branch (trigger branch_updated, the default; branch empty follows the branch the app was deployed from), or each new release tag (trigger release_tagged; a release is a tag such as v1.2.3, or one matching tag_pattern, such as release-*). Saved as a new configuration that takes effect at the app's next deploy. Refused while the app's deploys need approval.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
branch | string | With branch_updated: the branch to follow. |
enabledRequired | boolean | Whether the app deploys automatically. |
tag_pattern | string | With release_tagged: which tags are releases, such as release-*. |
trigger | "branch_updated" | "release_tagged" |
pando_set_notification_preference
Turn one of Pando's notifications on or off for you on one channel. kind and channel are as pando_get_notification_preferences lists them.
| Argument | Type | Description |
|---|---|---|
channelRequired | string | The channel's adapter ID, such as ntf_console. |
enabledRequired | string | true or false. |
kindRequired | string | The notification, such as app_shared. |
pando_set_registry_credential
Set the credential an image app's private image is pulled with, replacing any it had. It belongs to the app and is never given to it. Pando never shows it again; pando_get_registry_credential says only which kind is set.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
registry_credentialRequired | object | The credential. Either kind basic with username and password (a token that can read the image), or kind ecr with access_key_id, secret_access_key and optionally region, for AWS ECR. |
pando_set_secret
Set or rotate one of an app's secrets. Needs app.secrets.write. The app gets it only through a secret_ref in its spec: when the reply's read_by_spec is false, add {"key": ..., "secret_ref": ...} to a workload's env with pando_create_spec. Deploying after rotating one the app reads recreates its workload with the new value.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
keyRequired | string | The secret's name, such as NTFY_TOPIC. |
valueRequired | string | The value. |
pando_set_webhook_route_secret
Replace a webhook route's secret. The old one stops working at once. Without secret, one is generated and returned this once.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
nameRequired | string | The route's name. |
secret | string | The secret the provider issued. Left out, one is generated. |
pando_start_app
Start an app that was stopped, bringing back the version that was running.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
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.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_test_subscription
Send a test event to one subscription, whatever its filter says, to check its endpoint. Returns the delivery; read it with pando_get_delivery.
| Argument | Type | Description |
|---|---|---|
subscription_idRequired | string | The subscription's ID. |
pando_unassign_ai_function
Turn an AI function off by removing the adapter that handles it.
| Argument | Type | Description |
|---|---|---|
functionRequired | string | The AI function, such as search_audit. |
pando_unfavorite_app
Unpin an app from your launcher.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
pando_update_subscription
Change a subscription's events, url, adapter_id, channel or description, or turn it on or off with enabled (true or false).
| Argument | Type | Description |
|---|---|---|
adapter_id | string | A new notification adapter. Optional. |
channel | string | A new channel, for an adapter such as Slack. Optional. |
content_type | string | A webhook's content type. Optional. |
description | string | A new description. Optional. |
enabled | string | true or false. Optional. |
events | string | Comma-separated event names or patterns. Optional. |
headers | string | Replace a webhook's headers: one "Name: value" per line. Optional. |
method | string | A webhook's HTTP method: POST, PUT or PATCH. Optional. |
payload_template | string | A webhook's body as a Go template. Optional. |
subscription_idRequired | string | The subscription's ID, sub_…. |
url | string | A new webhook URL. Optional. |
pando_upload_source
Send an app's files as its source: a gzipped tar of the app's directory, base64-encoded, at most 256 MB compressed. Paths in the archive are relative to the app's root; leave out .git, node_modules and build output. A single index.html is enough for a static site. Replaces any files sent before. Then call pando_rerun_detection so Pando works out how to run them.
| Argument | Type | Description |
|---|---|---|
app_idRequired | string | The app's ID. |
archive_base64Required | string | The gzipped tar's bytes, base64-encoded. |