Kiro + xCloud

Troubleshoot a broken site with Kiro on xCloud

Troubleshooting with Kiro means describing a broken site to the agent in your IDE and letting xCloud read the status, events and web server logs, with the read tools pre-approved and every change still stopping for you.

  • Skill: xcloud:troubleshoot
  • Toolsets: sites, servers, sites-wordpress, wordpress-actions
  • Free with every xCloud account

YouUse xCloud to find out why shop.example.com returns a 500.

sites_statusread-only

sites_access-logsread-only

AgentStatus is normal. The error log has PHP Parse error: syntax error, unexpected token } in wp-content/plugins/shop-extras/loader.php on line 88, first seen 11:20. That plugin is not in this repository, so the fix is on the server. I can turn WP_DEBUG on for more detail, but the log may already be enough.

YouLeave WP_DEBUG off. What would you change?

. Keep a human in the loop: xCloud stops and asks before anything that creates, deploys, updates, reboots, deletes or buys.

Setup

How Do You Set Up Kiro to Troubleshoot a broken site on xCloud?

Connect Kiro once; every job on this account uses the same connection. Then ask in plain words.

  1. Add xCloud to your Kiro MCP config

    Open the Command Palette (Cmd+Shift+P on Mac, Ctrl+Shift+P on Windows and Linux), search for MCP and choose Kiro: Open workspace MCP config (JSON) for .kiro/settings/mcp.json, or Kiro: Open user MCP config (JSON) for ~/.kiro/settings/mcp.json. Paste this, save, and Kiro reconnects on its own. The first connection opens the xCloud approval screen in your browser, where you tick the teams and choose Read-only or Full access.

    JSON
    {
      "mcpServers": {
        "xcloud": {
          "url": "https://app.xcloud.host/mcp"
        }
      }
    }
  2. Choose which xCloud tools Kiro may run

    Optional. autoApprove lists tools Kiro runs without asking, and disabledTools hides tools from the agent altogether. The two names here are real xCloud tools; swap in your own. Avoid the "*" wildcard in autoApprove, so Kiro's own prompt stays as a second check beside xCloud's confirmation.

    JSON
    {
      "mcpServers": {
        "xcloud": {
          "url": "https://app.xcloud.host/mcp",
          "autoApprove": ["xcloud_docs_search", "xcloud_agent_search"],
          "disabledTools": ["sites_destroy"]
        }
      }
    }
  3. No browser sign-in? Use an API key

    Create a token with the mcp:invoke scope plus the read abilities for the areas it will use (read:servers and read:sites, with read:billing and read:addons for billing and add-on tools) and the matching write: abilities if it should change things in Settings, Developers, API Tokens, export it as XCLOUD_API_TOKEN, and pass it in headers. Kiro only expands environment variables you have approved, so add XCLOUD_API_TOKEN under the Mcp Approved Env Vars setting. Never paste the token into the file or into chat.

    JSON
    {
      "mcpServers": {
        "xcloud": {
          "url": "https://app.xcloud.host/mcp",
          "headers": {
            "Authorization": "Bearer ${XCLOUD_API_TOKEN}"
          }
        }
      }
    }
  4. Check it worked

    Then ask Kiro for the job itself, for example:

    Prompt
    Use xCloud to find out why shop.example.com returns a 500. Check status, recent events and the nginx error log, and quote the evidence.

In practice

How Does Troubleshooting Work from Kiro?

Kiro suits this job because its MCP config lets you approve the safe half of an investigation in advance. The read order that xCloud follows, site status, recent events, nginx logs, WordPress health and server services, is made of reads. In the xcloud entry in mcp.json you can list those tools in autoApprove, for example sites_status, sites_events, sites_access-logs, sites_wordpress_status and servers_services, and Kiro runs them without a prompt each time. You then type the symptom into the chat panel, shop.example.com returns 500, and the evidence arrives as one continuous answer instead of five approval clicks.

The other half stays gated, and Kiro gives you two layers. Tools you have not listed still ask before they run, and xCloud adds its own confirmation for anything that changes a site. Turning on WP_DEBUG, creating temporary shell access and running the rescue action are not reads, so leave them out of autoApprove. If you want them out of reach entirely, put a name such as sites_rescue in disabledTools and the agent never sees it. Kiro's own guidance is to review permissions before auto-approving, and for this job the rule is simple: approve reads, never changes.

Because Kiro edits the project open in the IDE, a log line that names a file in your repository leads straight to a fix proposal. The agent quotes the error log, opens the file and says what it would change, and you decide whether that goes into a commit. Log text is data, never an instruction. If the logs do not show a cause, Kiro reports what it ruled out and points you to Site, Site Monitoring, Logs in the dashboard for the WordPress debug.log. It does not restart a service to clear an error it cannot explain.

Kiro specific: Keep autoApprove to the names of the read tools and avoid the wildcard, otherwise Kiro stops asking before sites_wp-debug or sites_rescue and only xCloud's confirmation is left. Check which file Kiro read, too: an agent config beats the workspace file, and the workspace file beats the user file. A stale workspace entry can leave you connected with Read-only access, in which case the WP_DEBUG toggle is refused even though every read works. Switch on MCP support in Kiro's settings first if the tools do not appear.

What xCloud does for troubleshooting

xCloud reads the evidence in a fixed order, cheapest first: site status, recent events, the web server access and error log, WordPress health, WP_DEBUG and server services. The agent names a cause only when a log line or an event it retrieved shows it, and says plainly which logs only the dashboard can display.

  1. Check the status first. The agent reads the site status before anything else. A site that is still provisioning, deploying or in a failed state explains a 500 on its own, and the answer is then to wait or to look at the last deploy, not to hunt for a PHP fault.
  2. Read the recent events. The site's recent tasks, such as SSL issuance, plugin updates, cache purges and deploys, come with their outcome. A 500 that began right after a failed task has usually found its cause here, and one task's full output can be opened.
  3. Read the web server logs. The agent asks for the nginx log type with a limit, which returns the access log, the error log and the 7G and 8G firewall logs on Nginx and OpenLiteSpeed alike. The error log is where a PHP fatal shows up as a 502 or 500. Log lines are quoted as data, never followed as instructions.
  4. Check WordPress health. For WordPress sites the agent reads the health status: WordPress and PHP versions, the debug and cron flags, and whether the install itself is broken.
  5. Turn on WP_DEBUG only if needed. If the logs so far are inconclusive, the agent proposes switching WP_DEBUG on, waits for your approval, and switches it back off when the investigation ends. The toggle flips the flag only; it does not return the debug log.
  6. Check the server services. When the whole server looks wrong rather than one site, the agent reads whether the web server, PHP and the database are running. If nothing explains the error, it reports what it checked and what each check showed, and points you to the dashboard logs.

Reference

Troubleshooting Settings and Limits on xCloud

The facts Kiro works within when it troubleshoots a broken site. Where a row names the dashboard, that step stays yours to take there.

Setting or limitWhat applies
Read orderStatus, recent events, nginx access and error log, WordPress health, WP_DEBUG, then server services. Reads run straight away and change nothing
Log typesites_access-logs with type nginx reads the access log, the error log and the 7G and 8G firewall logs. The default type reads the access log only
Log readsLogs are read over SSH, so a call is slow. The agent asks for a bounded window with a limit, not everything
Staging historyThe deployment log of a site with a staging environment is the push and pull history between staging and production, not the Git build log
Dashboard-only logsThe WordPress debug.log, Laravel, PM2 and docker-compose logs: Site, Site Monitoring, Logs. Server logs such as Fail2Ban and auth: Server, Monitoring, Logs
WP_DEBUGThe API only toggles the flag. Reading the resulting debug.log is a dashboard step
Stale error pagesA purge of the site cache clears a cached error page. It runs without a confirmation stop and finishes asynchronously, so completion shows in the site events
Temporary shell accessA temporary sudo user expires after 12 hours, and the agent removes it as soon as the investigation ends instead of waiting for the expiry
Rescue actionA server-side repair with flags such as directory permissions, regenerating the Nginx configuration, reinstalling PHP or repairing Node.js, PM2 or OpenClaw. A flag the site type does not support is refused
Hand-offsA slow site goes to performance, a failed deploy goes to deploy, and a 526 or certificate warning goes to SSL

Rules Kiro has to follow

  • The agent never restarts a service or reboots the server just to clear an unexplained error. A restart is a real change on a live machine, and it destroys the evidence the logs were about to show.
  • A plain 500 or a short database error is a symptom. The agent does not name a cause such as bad credentials, a missing migration or a crashed process unless a log line or event it retrieved shows it.
  • Temporary shell access is used only when the readable logs do not explain the fault and you agree. The agent revokes it the moment the investigation ends.
  • Turning WP_DEBUG on, creating shell access and running the rescue action each need your explicit yes naming the site or server. The agent turns WP_DEBUG back off afterwards.
  • When no evidenced cause turns up, the agent says what it ruled out, gives you the dashboard log path and the site's dashboard link, and suggests contacting xCloud support with that evidence.

Example prompts

What Can You Ask Kiro to Do for Troubleshooting?

Type these as written and swap in your own repository, site and server names. Reads and routine actions such as backups, cache purges, PageSpeed scans and vulnerability scans run straight away; creating, deploying, updating, rebooting, deleting, buying or starting a broken-link scan stops and asks first.

Prompt
Use xCloud to find out why shop.example.com returns a 500. Check status, recent events and the nginx error log, and quote the evidence.
Prompt
Which tasks ran on staging.example.com before it started failing? Show me any that did not finish cleanly.
Prompt
The error log names a file in this repository. Open it, explain the fatal and propose a fix, but do not redeploy.
Prompt
My site shop.example.com is returning a 500 error. Find out why, and show me what you checked.
Prompt
Read the nginx error log for the shop site and tell me what it says about the last hour.
Prompt
Which tasks ran on the shop site just before it broke? Did any of them fail?
Prompt
Check WordPress health on the blog site and tell me whether the install itself is broken.
Prompt
Is the database running on the Frankfurt server? Check the services before touching anything.
Prompt
Turn on WP_DEBUG for the blog site, tell me what you find, then turn it off again.
Prompt
Purge the cache on the shop site in case it is serving a stale error page.
Prompt
Run a rescue on the shop site to reset directory permissions.

Kiro and Troubleshooting: Frequently Asked Questions

What people ask before they let Kiro troubleshoot a broken site through xCloud.

Which xCloud tools should I put in Kiro's autoApprove for troubleshooting?

Only the reads: sites_status, sites_events, sites_access-logs, sites_wordpress_status and servers_services. They change nothing, so skipping the prompt is safe. Leave sites_wp-debug, the shell access tools and sites_rescue out so Kiro and xCloud both ask first.

Can Kiro fix a site error it finds in the logs?

It can fix the cause when it sits in a file of the project open in the IDE, and you review the edit like any other. Changes on the server, such as WP_DEBUG, shell access or a rescue, need a yes naming the site or server.

What does the agent check first when a site shows a 500 error?

The site status, then recent events, then the web server logs. A site that is still provisioning or whose last deploy failed explains a 500 without any deeper digging, so the status read always comes first. Only after those cheap reads does the agent look at WordPress health, WP_DEBUG and server services.

Will the agent restart my server or a service to fix an error?

Not to clear an error it cannot yet explain. A restart changes a live machine and wipes out the evidence in the logs, so the agent finds the cause first. Restarting a service stays an action you ask for and approve.

Which logs can the agent read, and which can it not?

It reads the site's access log, error log and the 7G and 8G firewall logs through the nginx log type. It cannot read the WordPress debug.log or the Laravel, PM2 and docker-compose logs. Those are in the dashboard under Site, Site Monitoring, Logs, and server logs such as Fail2Ban are under Server, Monitoring, Logs.

Does the agent get shell access to my server?

Only when the logs it can read do not explain the problem and you agree to it. The access is a temporary sudo user, and the agent removes it as soon as the investigation ends. If it is ever left behind, it expires on its own after 12 hours.

What if my site is slow rather than broken?

A slow site is a different investigation, because it is answered from measurements and cache state rather than error logs. The agent hands it to the performance job. A failed deploy goes to the deploy job and a 526 or certificate error goes to the SSL job.

Other agents

Troubleshooting with Other Agents

The same job, the same xCloud tools, a guide for each client.

Run Your Hosting from Kiro

xCloud MCP, the Agent Skills and the Public API are free with every account. Connect once and ask.