App lifecycle
Inspect desired and actual app state, then start, stop, restart or delete.
Inspect desired and actual app state, then start, stop, restart or delete.
These are action names. In default compact mode, call the indicated group tool with {"action":"<action-name>","params":{...}}; the arguments below go inside params. In ?mode=all, call the action name directly with those arguments. browse_github and read_docs are direct tools in both modes. Expand each schema for nested fields, enum values and validation constraints. Successful results are JSON in both text content and structuredContent; failures use isError and structuredContent.error.
get_app_status
Read the live status of an app from the runtime. Aggregate state, each server's container state, where each port answers, recent errors. Poll this after start, stop or delete.
Group: apps · Behavior: Read
Compact tool: apps · Action: get_app_status
MCP annotations: readOnlyHint: true · destructiveHint: false · idempotentHint: true · openWorldHint: false
Permissions and REST equivalents
apps.status
GET /projects/{projectId}/apps/{appId}/status
apps:read
Arguments
projectId
string
Yes
Project id
appId
string
Yes
App id
Result
state("unknown" / "running" / "stopped" / "starting" / "stopping" / "scaling" / "updating" / "downloading" / "provisioning" / "start_blocked" / "error" / "building" / "build_failed"): Aggregate state; build states win while there is no runnable imagetargetState("running" / "stopped" / "unknown"): What the runtime was last asked for; unknown until it has been asked, as for a repository app before its first build succeedsnodes(array<object>): Servers the app is placed on and the container state on eachendpoints(array<object>): Where each configured port answers; a load-balanced port gets its address a minute or two after the first starterrors(array<object>): Recent runtime errors, newest firstworkOrders(array<object>): The runtime's latest instructions to servers, newest first; an order that never completes is the stallgrid(object or null): Grid placement details; null for a serverless apppollAfterSec(integer or null): Seconds to wait before reading the status again while it is changing; null in a settled stateid(string): App id
start_app
Ask the runtime to start an app. Returns once the request is accepted; poll the status to follow it.
Group: apps · Behavior: Write
Compact tool: apps_write · Action: start_app
MCP annotations: readOnlyHint: false · destructiveHint: false · idempotentHint: true · openWorldHint: true
Permissions and REST equivalents
apps.start
POST /projects/{projectId}/apps/{appId}/start
apps:write, compute:spend
Arguments
projectId
string
Yes
Project id
appId
string
Yes
App id
Result
id(string): App idtargetState("running" / "stopped"): State the runtime is now converging on
Operation-specific errors: 402 balance_over_limit, 429 grid_quota_exceeded, 403 serverless_disabled.
stop_app
Ask the runtime to stop an app. Returns once the request is accepted; poll the status to follow it.
Group: apps · Behavior: Write
Compact tool: apps_write · Action: stop_app
MCP annotations: readOnlyHint: false · destructiveHint: true · idempotentHint: true · openWorldHint: false
Permissions and REST equivalents
apps.stop
POST /projects/{projectId}/apps/{appId}/stop
apps:write
Arguments
projectId
string
Yes
Project id
appId
string
Yes
App id
Result
id(string): App idtargetState("running" / "stopped"): State the runtime is now converging on
restart_app
Stop an app, wait for it to report stopped, then start it again. It waits up to waitSec (default 30); if the app is still stopping when the wait runs out the start is issued anyway; check get_app_status afterwards.
Group: apps · Behavior: Write
Compact tool: apps_write · Action: restart_app
MCP annotations: readOnlyHint: false · destructiveHint: true · idempotentHint: false · openWorldHint: true
Permissions and REST equivalents
apps.restart
POST /projects/{projectId}/apps/{appId}/restart
apps:write, compute:spend
Arguments
waitSec
integer
No
Seconds to wait for the stop before starting, 0 to 180 (default 30)
projectId
string
Yes
Project id
appId
string
Yes
App id
Result
id(string): App idtargetState("running"): State the runtime is now converging onstoppedBeforeStart(boolean): The app reported stopped before the start was issued; false when the wait ran outwaitedSec(integer): Seconds spent waiting for the stop
Operation-specific errors: 402 balance_over_limit, 429 grid_quota_exceeded, 403 serverless_disabled.
delete_app
Delete a stopped app (admins, or its creator). Fails with app_running while any node is still live. Irreversible.
Group: apps · Behavior: Write
Compact tool: apps_write · Action: delete_app
MCP annotations: readOnlyHint: false · destructiveHint: true · idempotentHint: false · openWorldHint: false
Requires confirm: true for this irreversible action.
Permissions and REST equivalents
apps.delete
DELETE /projects/{projectId}/apps/{appId}
apps:admin
Arguments
projectId
string
Yes
Project id
appId
string
Yes
App id
confirm
true
Yes
Must be true: this action cannot be undone
Result
id(string): Id of the deleted appdeleted(true): See the complete response schema below.
Operation-specific errors: 409 app_running.
Was this helpful?
