# Connecting your AI
Once your assistant is connected, you run your hosting by describing what you want in a chat window. You say "list my projects", "set up WordPress", "deploy this repository" or "this site is broken, what happened?", and it does the work.
You need an installed engine. The installer already printed a Claude Code command. For any other assistant, get yours with Create a token.
# Set your assistant up
On your VPS, run pae connect and pick yours with the arrow keys. Each page below has how to check it worked and what usually goes wrong.
| Assistant | Page |
|---|---|
| Claude Code | Set up Claude Code |
| Claude Desktop | Set up Claude Desktop |
| Cursor | Set up Cursor |
| Codex | Set up Codex |
| ChatGPT Desktop | Set up ChatGPT Desktop |
| Gemini CLI | Set up Gemini CLI |
| VS Code / GitHub Copilot | Set up VS Code and Copilot |
| Grok | Set up Grok |
| OpenCode | Set up OpenCode |
| Windsurf | Set up Windsurf |
| Pi | Set up Pi |
| Hermes | Set up Hermes |
| OpenClaw | Set up OpenClaw |
Using something else? Any assistant that speaks MCP will work: Connecting other assistants.
# Decide what the assistant may do
Read this before you paste a token anywhere.
A token with default permissions can permanently delete an entire project and everything in it, including its files, databases and websites. That is what the engine's own interface can do, and the token grants access to all of it.
# The quick way: let the engine ask
pae configure mcp-tokens
What this does: opens the assistant part of Configure the engine. Choose Global scope for checkboxes, whole groups or one group's commands at a time, and one setting for how far a ticked command may go. Tick what every assistant may use, untick what it may not. Nothing is written until you pick Review and save and say yes, and what it replaces is printed so you can put it back. Add --dry-run to see what it would write and write nothing.
pae configure on its own starts one level up, with the address, tokens, the queue, and telemetry.
Use it instead of editing the file by hand. The rest of this section is the reference for the settings it writes, and how to set the same things yourself.
# Different limits for different assistants
Everything above applies to the whole engine. To give one assistant less than another, run the same command and choose Tokens. It lists your assistants' tokens, and lets you tick what each one may use. It can only take away. An assistant cannot be given a command the engine is not offering. Ticking everything means "no limit", so that assistant keeps whatever the engine offers. pae mcp:token:list shows the result in its Commands column.
An assistant asked for its command list when it connected, so reconnect it to see the change.
A token minted for an assistant is refused if someone tries to use it against the engine's own API directly, so these limits are not one command away from being stepped around. A token minted for your own software (pae api:token:create) is refused at the assistant endpoint for the same reason. Tokens made before this distinction existed can still do both; mint a new one of the right kind to narrow that.
A token can also be limited to some projects instead of some commands. pae cannot make one, software that calls the engine's API does: A token limited to some projects.
Whatever the limits, a token you no longer trust should be revoked with pae mcp:token:revoke {id}, which stops it everywhere at once.
These settings live in /opt/panelalpha/shared-hosting/.env-core. If you edit that file by hand, the change does nothing until you restart the engine: Change a setting. Either way, an assistant that is already connected keeps the tool list it was given when it connected. Reconnect it to see the change.
# How far it may go
| Value | What the assistant can do |
|---|---|
readonly | Look at what is switched on, change nothing. Inspecting a repository still works. The tools that hand out a password or a login (system_exim_config_get, app_credentials_get) are not offered. |
modify | Create and change things, and blocks only DELETE routes. It is not a "no destructive actions" setting: the write tools that are not plain creations (ssh_run, wp_cli_run, backup_restore, file_write, system_update, firewall_disable, project_rebuild) still run. |
full | Everything, including deletion. This is the default. |
MCP_PERMISSION_MODE=readonly
# Which areas it can see
A new install exposes every group. The group names the setting accepts are in the table on Every tool. That is also the default:
MCP_TOOLSETS=all
To limit the assistant to some groups, replace all with a comma-separated list of those names. Do not add one name on top of all: all already includes every group.
An empty value means every group, not none. A setting nobody has touched and one that permits everything are the same thing here, so if you want no group at all, write MCP_TOOLSETS=none. Single tools named in MCP_TOOLS still work on top of that.
If this engine was installed earlier and you never set MCP_TOOLSETS, the assistant now sees every group, including ones it could not see before. Narrow the list if that is more than you want.
# One tool from an off group
Use this when you want a single operation from a group you are otherwise leaving off:
MCP_TOOLS=wp_cli_run,project_setting_set
What this does: exposes those tools on top of the groups above. Names must match the tool names on Every tool.
# Tools to take away
MCP_DENIED_TOOLS=project_delete,*_delete
What this does: removes those tools no matter what enabled them. * matches a family: project_* is every project tool, *_delete is every delete.
A regular expression, without delimiters, is also accepted as MCP_DENIED_TOOLS_REGEX. An invalid pattern is ignored, so a typo cannot silently disable the denylist.
A tool has to be in an enabled group (or named in MCP_TOOLS), allowed by the permission ceiling, and not denied. Denials always win. Naming a destructive tool in MCP_TOOLS does not get it past MCP_PERMISSION_MODE=readonly.
# How many tools the assistant loads
The full list is 225 tools, and an assistant loads every listed tool's description when it connects. That is about 95 KB of text it carries around before you have asked for anything. So by default the engine lists only what deploying, checking and running a project takes, plus two more:
search_toolsfinds any other tool by what it does, for examplemysql userorcron.execute_toolsruns the tool it found.
The assistant does this on its own when you ask for something that is not in the short list. Nothing is hidden this way. Everything the settings above allow can still be found and run, and nothing they remove can.
MCP_TOOL_SEARCH=true
MCP_DIRECT_TOOLS=project_get,project_create,project_rebuild,task_get,deploy_log_get
MCP_DIRECT_TOOLS is the short list, comma-separated, with * wildcards. To list every tool directly, as older engines did, set MCP_TOOL_SEARCH=false. Left unset, the short list is:
| For | Tools |
|---|---|
| Overview | metrics_latest, project_list_summary, project_list |
| Deploying | project_create, project_deploy_archive, file_upload, file_write, project_rebuild, deploy_log_get, deploy_cancel, task_get |
| Checking | project_get, project_inspect, app_health_check, container_service_logs |
| Running | project_suspend, project_unsuspend, project_delete, container_project_action, domain_list, domain_create, ssl_cert_request |
Large results come back in pieces. deploy_log_get returns about 48 KB of log at a time, and file_download and domain_log_download return about 48 KB of a file at a time, as text when the file is text. Each result says whether there is more and where the next piece starts. Any other result over 256 KB is refused with a note on how to ask for less. The assistant handles this itself.
One thing to know if your assistant asks before it runs a tool: it sees execute_tools, not the tool inside it. If you tell it to always allow execute_tools, you have allowed every tool it can find. Use MCP_PERMISSION_MODE and MCP_DENIED_TOOLS for the limits that must hold. The engine enforces those itself.
These settings only affect the assistant. They do not change the REST API or pae.
# Check what is on offer
After a restart:
pae mcp:tool:list
What you should see: a table of tool names, their group, the HTTP verb, and whether each is a read or a write. The summary line is how many are exposed and how many are withheld.
To see what this configuration removes:
pae mcp:tool:list --excluded
To see one group:
pae mcp:tool:list --toolset=projects
Anything missing from the first list is missing for the assistant too.
# What to ask
These are not magic phrases. Describe things your own way. They show the level of detail worth giving. If the assistant refuses, you have limited what it may do: Decide what the assistant may do.
See what you already host
List the projects on this engine.
Look after a WordPress site that is already here
List the users on this WordPress site.
Update all plugins on this site.
Backups and domains work on WordPress that is already on this engine. The WordPress user, install and one-click-login actions need a WordPress site in its own container. WP-CLI and changing PHP need traditional PHP hosting: If WordPress is already on this engine.
Change the PHP version on traditional WordPress
What PHP versions can this engine run?
Set shop.example.com to PHP 8.2.
Raise PHP memory on this project
Set PHP memory_limit to 256M on this project.
Deploy a public repository
Deploy my application https://github.com/org/app on this PanelAlpha Engine.
Deploy a private repository
Deploy https://github.com/org/private-app on this PanelAlpha Engine.
The repository is private.
Do not paste the git token into the chat. The assistant sends a link on the engine; open it, paste the token, save, and tell the assistant you are done. Full steps: A private repository.
Check what a repository is before deploying it
Inspect this repository and tell me what stack you detect, without creating
anything: https://github.com/org/app
If it lists more than one way to run the project, you can pick:
Deploy https://github.com/org/app as php
Add your own domain with HTTPS
Add the domain shop.example.com to this project and request a Let's Encrypt
certificate for it.
Point the DNS record at your VPS first, or the certificate request will fail.
Reach a site through Cloudflare
Attach shop.example.com to this project through a Cloudflare tunnel.
Do not paste the Cloudflare API token into the chat. The assistant sends a paste link for it. Full steps: Cloudflare.
Fix a site that is not working
This site does not open. Read the deploy log, check what the site is actually
serving, and fix what you can.
The assistant sees the deploy log, the health checks, and what the site returns from inside your VPS.
Create a database
Create a MySQL database named shop on this project, create a user for it, and
grant that user access.
Back up and restore
Create a backup of this project.
Restore last backup onto this project.
A restore overwrites the live site. Ask to see the list of backups first.
Make a test copy of a live site
Make a staging copy of this project.
Push the staging copy live.
Install WordPress
Install WordPress on this project. Title: My Site. Admin user: admin.
Admin email: [email protected]. Admin password: <password>
Change a setting your application reads
Set DATABASE_URL to <value> on this project and rebuild.
The rebuild matters. Most applications only read their settings when they start.
Check the VPS itself
How much CPU, memory and disk is this host using, and how close is this
project to its limits?
Report that the engine got something wrong
File a bug: the engine treated this project wrongly. Here is what happened
and what should have happened instead.
Open the address the assistant gives you, not the one you expected. If it ends in .local, the site is not reachable from the internet: Domains and HTTPS. When something is wrong, say so in the same conversation rather than starting over.
# Troubleshooting
The assistant registered your VPS but will not connect. Almost always the certificate. Your engine is self-signed and the assistant's machine does not trust it. Fixed on your computer, not your VPS: Trust a self-signed certificate.
A 401 error.
Wrong token type. Assistants need a token from pae connect or pae mcp:token:create, not pae api:token:create. Or the token was truncated when you copied it.
The assistant says it cannot do something you know the engine can do.
The permission settings are filtering it out. Run pae mcp:tool:list on your VPS. Check MCP_PERMISSION_MODE, MCP_TOOLSETS, MCP_TOOLS and MCP_DENIED_TOOLS in .env-core. If the tool is allowed but not in the assistant's list, ask it to look for it with search_tools (see How many tools the assistant loads). Every tool is the full list. That list is not the same as what your assistant is currently allowed to call.
I set a permission mode and everything became read-only.
The value must be exactly readonly, modify or full. Anything else is treated as readonly.
The assistant is being rate limited. There is a limit of 60 requests a minute per token. If you hit it routinely, something is probably retrying in a loop rather than doing 60 real operations.
The assistant asked me to paste a git or Cloudflare token in the chat. Do not. Those go on a paste page the assistant should send you: A private repository · Cloudflare.
My assistant can still do something I removed.
Your assistant is using a list it loaded earlier. Restart your assistant, then run pae mcp:tool:list on your VPS to see the truth.
# Every tool
This is every MCP tool the engine ships: 225 tools, grouped by area. You do not type these names. You describe the work in chat, and the assistant picks the tool.
A project is one hosting account. Every tool takes it as name; what the tools return still calls that value username, the REST API's name for it.
A new install exposes all of them. Every group in the table below is on by default. The group name in the Toolset column is what you put in MCP_TOOLSETS if you want to narrow what the assistant can see. How to turn a group off, add one tool, or deny one: Decide what the assistant may do. What this engine is actually offering:
pae mcp:tool:list
# Groups
| Group | Toolset | Default | Tools |
|---|---|---|---|
| Engine summaries | engine | On | 2 |
| Projects | projects | On | 22 |
| Domains | domains | On | 8 |
| Domain PHP | domainphp | On | 4 |
| Domain ACME | domainacme | On | 5 |
| Domain log files | domainlogfiles | On | 2 |
| SSL certificates | sslcertificates | On | 3 |
| MySQL databases | mysqldatabases | On | 5 |
| MySQL users | mysqlusers | On | 6 |
| MySQL privileges | mysqlprivileges | On | 3 |
| MySQL server | mysqlserver | On | 2 |
| FTP accounts | ftpaccounts | On | 4 |
| SFTP accounts | sftpaccounts | On | 6 |
| Cron jobs | cronjobs | On | 4 |
| Files | files | On | 15 |
| PHP | php | On | 4 |
| Containers | containers | On | 5 |
| App users | appusers | On | 8 |
| Usage | usage | On | 5 |
| WP-CLI | wpcli | On | 1 |
| Deploy | deploy | On | 7 |
| Proxy rules | proxyrules | On | 5 |
| System | system | On | 15 |
| Server metrics | servermetrics | On | 5 |
| Firewall | firewall | On | 12 |
| IP management | ipmanagement | On | 6 |
| ModSecurity | modsecurity | On | 11 |
| Lighthouse | lighthouse | On | 1 |
| Backup stores | backupcontainers | On | 6 |
| Bug reports | bugreports | On | 1 |
| Backups | backups | On | 9 |
| Tunnels | tunnels | On | 3 |
| Git | git | On | 16 |
| Project settings | projectsettings | On | 4 |
| SSH | ssh | On | 1 |
| Tasks | tasks | On | 4 |
| Secret vault | secretvault | On | 5 |
# Engine summaries
| Tool | What it does |
|---|---|
metrics_latest | The most recent CPU, RAM, disk I/O and network I/O sample. metrics_current is the same reading through the API |
project_list_summary | Every hosting project on this VPS: name, status, and how many domains it has. One call, never paginates |
# Projects
| Tool | What it does |
|---|---|
app_credentials_get | Get the admin login the engine generated for the deployed application |
env_var_list | List the environment variables a container project holds, with the values hidden unless asked for |
env_var_set | Set or remove environment variables of a container project, and apply them without a rebuild if asked |
project_clone | Clone a project |
project_create | Create a new hosting project (async) |
project_create_sync | Create a project and wait for the deploy in the same call. Same body as project_create |
project_delete | Delete a project and everything in it |
project_deploy_archive | Deploy an uploaded zip/tar into ~/project |
project_get | Get a project |
project_list | List projects (paginated) |
project_list_all | List all projects (no pagination) |
project_password_set | Set a password visitors must type before they see the site |
project_password_unset | Remove that password |
project_push | Push project state to a paired staging or live project |
project_push_diff | Compare the database tables of a staging project with its live project, without copying anything |
project_rebuild | Redeploy a project |
project_source_attach | Attach a git repository to a project created without one, and deploy it |
project_staging | Create a linked staging mirror of a live project |
project_suspend | Suspend a project |
project_unsuspend | Unsuspend a project |
project_update | Update a project |
project_verify_name | Check that a project name is available |
# Domains
| Tool | What it does |
|---|---|
domain_create | Add a domain to a project |
domain_delete | Delete a domain |
domain_find | Get a domain by name (system-wide) |
domain_get | Get a domain |
domain_list | List domains of a project |
domain_mail_dns_get | List and check the mail DNS records of a domain |
domain_update | Update a domain |
ssl_cert_request | Request a Let's Encrypt certificate for a domain |
# Domain PHP
| Tool | What it does |
|---|---|
domain_php_directives_get | Show the PHP settings for one domain. Traditional PHP hosting |
domain_php_directives_set | Replace the whole set of PHP settings for one domain. Naming one setting drops the others. An empty set removes them |
domain_php_version_get | Get PHP version for a domain |
domain_php_version_set | Set PHP version for a domain |
# Domain ACME
| Tool | What it does |
|---|---|
acme_challenge_create | Create an HTTP-01 ACME challenge |
acme_challenge_delete | Delete a single HTTP-01 ACME challenge |
acme_challenge_delete_all | Delete all HTTP-01 ACME challenges for a domain |
acme_challenge_get | Get a single HTTP-01 ACME challenge |
acme_challenge_list | List HTTP-01 ACME challenges for a domain |
# Domain log files
| Tool | What it does |
|---|---|
domain_log_download | Download a domain log file |
domain_log_list | List log files for a domain |
# SSL certificates
| Tool | What it does |
|---|---|
ssl_cert_get | Get installed SSL cert for a domain |
ssl_cert_install | Install a custom SSL certificate on a domain |
ssl_cert_list | List installed SSL certificates for the domains of a project |
# MySQL databases
| Tool | What it does |
|---|---|
mysql_database_create | Create a MySQL database |
mysql_database_delete | Delete a MySQL database |
mysql_database_get | Get a MySQL database |
mysql_database_list | List MySQL databases of a project |
mysql_database_rename | Rename a MySQL database |
# MySQL users
| Tool | What it does |
|---|---|
mysql_user_change_password | Change a MySQL user password |
mysql_user_create | Create a MySQL user |
mysql_user_delete | Delete a MySQL user |
mysql_user_get | Get a MySQL user |
mysql_user_list | List MySQL users of a project |
mysql_user_rename | Rename a MySQL user |
# MySQL privileges
| Tool | What it does |
|---|---|
mysql_privileges_get | Get MySQL privileges for a user on a database |
mysql_privileges_revoke | Revoke all MySQL privileges for a user on a database |
mysql_privileges_set | Update MySQL privileges for a user on a database |
# MySQL server
| Tool | What it does |
|---|---|
mysql_server_info | Get MySQL server connection info |
phpmyadmin_sso_token_create | Create a phpMyAdmin SSO token for a project |
# FTP accounts
| Tool | What it does |
|---|---|
ftp_account_create | Create an FTP account |
ftp_account_delete | Delete an FTP account |
ftp_account_list | List FTP accounts for a user |
ftp_account_update | Update an FTP account |
# SFTP accounts
| Tool | What it does |
|---|---|
sftp_account_create | Create an SFTP account |
sftp_account_delete | Delete an SFTP account |
sftp_account_list | List SFTP accounts for a user |
sftp_account_update | Update an SFTP account |
sftp_session_kill | End the open SFTP sessions of one account |
sftp_session_kill_all | End every open SFTP session of a project |
# Cron jobs
| Tool | What it does |
|---|---|
cron_job_create | Create a cron job |
cron_job_delete | Delete a cron job |
cron_job_list | List cron jobs of a project |
cron_job_update | Update a cron job |
# Files
| Tool | What it does |
|---|---|
file_chmod | Set the mode of one file or directory. Three or four octal digits. Does not walk into folders inside it |
file_copy | Copy a file or directory |
file_delete | Delete a file or directory |
file_download | Download a file |
file_exists | Check if a file or directory exists |
file_fetch | Download an http or https address into a directory that already exists. Does not deploy the file |
file_list | List what is in a directory, directories first |
file_mkdir | Create a directory |
file_move | Move or rename a file or directory |
file_move_contents | Move the immediate children of a directory into a destination that already exists |
file_stat | Get file or directory stats |
file_unzip | Extract a ZIP archive |
file_upload | Upload a file |
file_write | Write content to a file |
file_zip | Create a ZIP archive |
# PHP
| Tool | What it does |
|---|---|
php_error_log_get | Read the PHP error log of a project |
php_ini_get | Get custom PHP INI settings of a project |
php_ini_set | Update custom PHP INI settings of a project |
php_version_list | List available PHP versions on your VPS |
# Containers
| Tool | What it does |
|---|---|
app_health_check | Check that the deployed application answers on its published ports |
container_list | List Docker containers of a project |
container_project_action | Perform a project-level Docker Compose action |
container_service_action | Perform a service-level Docker action |
container_service_logs | Get logs from a Docker service |
# App users
| Tool | What it does |
|---|---|
app_info | Get app info and capabilities |
app_install | Install the app (e.g. run WordPress installer) |
app_role_list | List available app roles |
app_user_create | Create an app user |
app_user_delete | Delete an app user |
app_user_list | List app users (e.g. WordPress users) |
app_user_reset_password | Reset an app user password |
app_user_sso_create | Create an SSO token for an app user |
# Usage
| Tool | What it does |
|---|---|
project_usage | Resource usage for a project, including this month's transfer vs the bandwidth limit |
project_bandwidth | Project transfer over a date range (start, end, group_by day or month), in bytes |
domain_bandwidth | Transfer over a date range for one domain |
domain_visitors | Visitor overview for a domain. start/end clip daily hits and visits; unique visitors, session length, and breakdowns are overlapping calendar months. Period aliases such as last-week stay in the client. |
domain_visitors_breakdown | Visitor breakdown by pages, countries, continents, regions, referrers, os, or browsers (month grain), or requests and bytes per HTTP status (status_codes, exact range) |
# WP-CLI
| Tool | What it does |
|---|---|
wp_cli_run | Run a WP-CLI command |
# Deploy
| Tool | What it does |
|---|---|
deploy_cancel | Cancel a running deploy: mark cancelled, kill the subprocess tree, clean up |
deploy_list | List the deploys the project still has a log of, newest first |
deploy_log_get | Poll the deploy log (JSON-lines) from a byte-like line offset |
deploy_log_read | Read a page of one kept deploy's log by its id |
project_inspect | Inspect a project's deployed application files |
source_inspect | Inspect an application source and report its stack, ports and services |
source_refs | List the branches and tags of a remote repository, without cloning it |
# Proxy rules
| Tool | What it does |
|---|---|
proxy_rule_create | Create a proxy rule |
proxy_rule_delete | Delete a proxy rule |
proxy_rule_get | Get a proxy rule |
proxy_rule_list | List all proxy rules |
proxy_rule_update | Update a proxy rule |
# System
| Tool | What it does |
|---|---|
system_api_access_allow | Let a project call this engine's API, or change its scope |
system_api_access_deny | Take that access away from a project |
system_api_access_list | List the projects allowed to call the engine's API |
system_api_access_rotate | Replace an allowed project's API token |
system_engine_cert_request | Request the engine's own Let's Encrypt certificate |
system_exim_config_get | Get Exim mail server configuration |
system_exim_config_set | Update Exim mail server configuration |
system_info | Get system information |
system_ssl_config_get | How certificates for project sites are obtained |
system_ssl_config_set | Set how certificates for project sites are obtained |
system_test_email_send | Send a test email via Exim |
system_update | Starts a background updater on the VPS. Not how you update day to day: Updating |
system_webserver_change | Change the active webserver. Not supported: the engine runs nginx-proxy only |
system_webserver_config_set | Update webserver configuration |
system_webserver_password_reset | Reset a webserver admin panel password. Not supported on the default nginx-proxy install |
# Server metrics
| Tool | What it does |
|---|---|
metrics_current | Get current server metrics |
metrics_last_12_hours | Get metrics for the last 12 hours |
metrics_last_5_minutes | Get metrics for the last 5 minutes |
metrics_last_hour | Get metrics for the last hour |
metrics_last_hour_averages | Get last hour metric averages |
# Firewall
| Tool | What it does |
|---|---|
firewall_disable | Disable the firewall |
firewall_enable | Enable the firewall |
firewall_log_list | Read what the firewall blocked and banned |
firewall_reload | Reload the firewall |
firewall_rule_create | Add a firewall rule |
firewall_rule_delete | Delete a firewall rule |
firewall_rule_list | List firewall rules |
firewall_rule_update | Edit a firewall rule |
firewall_status | Get the firewall status |
firewall_trusted_add | Trust an address |
firewall_trusted_delete | Stop trusting an address |
firewall_trusted_list | List trusted addresses |
# IP management
| Tool | What it does |
|---|---|
ip_assign | Assign an IP address to a project |
ip_assigned_list | List assigned IP addresses |
ip_subnet_create | Add an IP subnet |
ip_subnet_delete | Delete an IP subnet |
ip_subnet_list | List IP subnets |
ip_unassign | Unassign an IP address from a project |
# ModSecurity
| Tool | What it does |
|---|---|
modsec_audit_log_download | Download a ModSecurity audit log file |
modsec_audit_log_list | List ModSecurity audit log files |
modsec_audit_log_tail | Tail a ModSecurity audit log file |
modsec_custom_rules_get | Get the custom ModSecurity rules |
modsec_custom_rules_set | Replace the custom ModSecurity rules |
modsec_mode_get | Get ModSecurity mode |
modsec_mode_set | Set ModSecurity mode |
modsec_ruleset_configs_set | Toggle ModSecurity ruleset config files |
modsec_ruleset_disable | Disable a ModSecurity ruleset |
modsec_ruleset_enable | Enable a ModSecurity ruleset |
modsec_ruleset_list | List ModSecurity rulesets |
# Lighthouse
| Tool | What it does |
|---|---|
lighthouse_report_create | Generate a Lighthouse performance report |
# Backup stores
| Tool | What it does |
|---|---|
backup_container_create | Create a backup container |
backup_container_delete | Delete a backup container |
backup_container_get | Get a backup container |
backup_container_list | List backup containers |
backup_container_test | Test backup container connectivity |
backup_container_update | Update a backup container |
# Bug reports
| Tool | What it does |
|---|---|
bug_report_create | File a bug report about a deployed application |
# Backups
| Tool | What it does |
|---|---|
backup_create | Create a project backup |
backup_delete | Delete a project backup |
backup_get | Get a project backup |
backup_item_download | Download one item of a finished backup |
backup_list | List backups for a project |
backup_restore | Restore a project backup |
backup_schedule_delete | Remove a project's automatic backup schedule |
backup_schedule_get | Show a project's automatic backup schedule |
backup_schedule_set | Create or replace a project's automatic backup schedule |
# Tunnels
| Tool | What it does |
|---|---|
tunnel_create | Attach a public tunnel hostname to a domain |
tunnel_delete | Remove a public tunnel hostname |
tunnel_list | List a domain's public tunnel hostnames |
# Git
| Tool | What it does |
|---|---|
git_branches | List git branches |
git_change_branch | Change the tracked git branch |
git_commits | List git commits |
git_connect | Connect a directory to a git remote |
git_deploy_hook_create | Create a push-to-deploy hook |
git_deploy_hook_delete | Delete a push-to-deploy hook |
git_deploy_hook_rotate | Rotate a push-to-deploy hook |
git_deploy_hook_show | Show a push-to-deploy hook |
git_deploy_key_create | Create a git deploy key |
git_deploy_key_delete | Delete a git deploy key |
git_disconnect | Disconnect git from a directory |
git_pull | Pull from the git remote |
git_push | Push local git changes |
git_revert | Revert local git changes |
git_status | Git repository status |
git_update_credentials | Update git credentials for a directory |
# Project settings
| Tool | What it does |
|---|---|
project_setting_delete | Clear one project setting |
project_setting_get | Get one project setting |
project_setting_list | List a project's settings |
project_setting_set | Set one project setting |
# SSH
| Tool | What it does |
|---|---|
ssh_run | Run a shell command inside the project container |
# Tasks
| Tool | What it does |
|---|---|
task_cancel | Cancel a queued or running task; kill the work subprocess if it still matches |
task_get | Poll a task status and new log lines after a cursor |
task_list | List tasks, newest first, filtered by project, status, action or time |
task_log_list | Page of task log lines after a timestamp and/or id cursor |
# Secret vault
Used when a private repository or a Cloudflare tunnel needs a token. You paste the value on a page the engine sends you, not in the chat: A private repository · Cloudflare.
| Tool | What it does |
|---|---|
vault_secret_create | Creates a paste page so you can give the engine a secret without putting it in chat |
vault_secret_delete | Deletes a paste slot |
vault_secret_list | Lists paste slots. The secret itself is never included |
vault_secret_status | Whether a paste slot has a secret yet |
vault_config_get | Which global secrets are stored |
# What you can see, and what you cannot
A secret is never readable again. Not by your assistant, not by you, not by any command. What you can always see is the inventory: each entry's reference (vault:<id>), what kind of secret it is, what it is for, which project owns it, whether it has been filled in yet, and the dates.
Give a purpose when you ask for a link ("deploy key for the shop repo"). It is shown on the paste page, so whoever hands over a credential can see why it is wanted, and it appears in the listing afterwards. Since the value itself can never be read back, the purpose is usually the only thing that tells two entries of the same kind apart when you come to tidy up.
# A secret cannot be edited, only replaced
Once a value has been pasted it is final. Opening the link again will not change it. To replace one, delete the entry and create a fresh link. This is deliberate: an overwrite would be invisible afterwards, because nothing can read the value back to check.
# Project secrets and global secrets
A secret belongs to one project by default. The first project it is given to owns it, and any other project that tries to use it is refused. You can also name the project when you ask for the link ("a Git token for the shop project"); then only that project can use it, even if it does not exist yet.
Ask for a global secret when several projects should share one:
Save a global Git token for the acme GitHub organisation.
You can keep several global secrets of the same kind; the purpose tells them apart. A global secret is used only for a project you name it for:
Create a project from https://github.com/acme/shop with the global
acme Git token.
The assistant passes the secret's reference, such as vault:7, in place of the token. A project created without a token gets none, even when the engine holds global secrets. Inspecting a repository can use a global secret, or a project secret that no project owns yet. Inspecting does not make the secret belong to anything; the first project given it does.
The paste page closes after an hour. A secret is kept until it is deleted, unless you give it an expiry when you ask for the link ("keep it for 7 days"); after that it is refused and the engine deletes it by itself. A project stores the secret it was given, so deleting the vault entry does not take it away from projects that already used it. The engine never looks a secret up in the vault on a project's behalf.
When the engine was updated to this scheme, each project that was using the old shared token had that token stored on it, so it keeps working. From the server: Secrets.
# From the server
The same work without an assistant: CLI commands.