---
title: Agents
description: Let an agent find issues, read them and every event in them, see how similar ones were fixed, and resolve, mute or label them, through triage's MCP server.
---

Triage serves [MCP](https://modelcontextprotocol.io), so an agent can find and read issues and their events, then resolve, mute or label them. Give it an issue ID or paste a link to the issue's page, and it reads the rest itself, or let it search for one. The issue page's **Copy for agent** button copies the link with a line telling the agent which tools to use.

The tools see what the web UI does: redacted events, the names hosts were enrolled with, decisions and suggested fixes. They can change what the issue page's buttons change, and nothing else.

| Tool | Does |
| --- | --- |
| `list_issues` | Issues, the latest seen first, filtered by title, state, kind, host or label like the web UI's list, and sorted the same ways. Pass `nextOffset` back until it's missing to page through them |
| `get_issue` | The issue, the hosts it happened on, decisions, suggested fixes, [notes](/issues#notes), its fingerprints and its latest 20 events |
| `get_issue_events` | A page of its events, newest first, up to 500 at a time. Pass `nextOffset` back until it's missing to read them all |
| `find_similar_issues` | Issues like it, with the fixes suggested for each and their notes, resolved ones first |
| `set_issue_status` | Resolves, mutes or reopens the issue, with an optional note on why |
| `add_issue_note` | Adds a note to the issue without changing its status |
| `label_issue` | Labels the issue worth fixing or noise |
| `merge_issues` | [Merges](/issues#merging) issues that are the same problem into the one seen first |

`find_similar_issues` counts an issue as similar when it's a crash of the same program with the same signal, the same unit failing in any way, another error from the same program, or another OOM kill.

The server tells agents to close an issue once they've fixed it, without waiting to be asked. Each host the issue happened on needs the fix, so the agent checks it's in place on the hosts it can reach and asks you about the others. Then it asks you before resolving the issue. That includes issues that started while the fix was being built and tested, such as a half-finished unit failing. Issues that are noise and can't be fixed get muted instead.

## Skill

An agent fixing a failing unit, a crash or an error in another repository doesn't know triage has already collected it, so it never looks. The `triage-resolve` [Agent Skill](https://agentskills.io) tells it to: once the fix is in place, it finds the matching issues by unit, program or logger on the hosts involved, checks the fix reached each host, and asks you before resolving them with a note on the commit or version and the hosts. It needs the MCP server.

Install it with the [Skills CLI](https://skills.sh):

```bash
npx skills add timmo001/triage --skill triage-resolve
```

Or in Claude Code:

```text
/plugin install triage --marketplace timmo001/triage
```

The release tarballs also carry the skill beside the binary, in `skills/triage-resolve`, so it always matches the version you installed. With [mise](https://mise.jdx.dev), point your agent at the `skills` folder in `mise where github:timmo001/triage`.

Agents ask you before merging issues too, since a wrong merge mixes their events and statuses. `merge_issues` is marked destructive, so clients that check for that ask you to approve it as well.

## Over stdio

`triage mcp` serves the tools to an agent that starts it. It reads the server at `TRIAGE_SERVER` as the admin in `TRIAGE_ADMIN_TOKEN`, or the server database on this machine when `TRIAGE_SERVER` isn't set. For OpenCode:

```json
{
  "mcp": {
    "triage": {
      "type": "local",
      "command": ["triage", "mcp"],
      "environment": {
        "TRIAGE_SERVER": "https://triage.example.com",
        "TRIAGE_ADMIN_TOKEN": "{env:TRIAGE_ADMIN_TOKEN}"
      }
    }
  }
}
```

## Over HTTP

The server also serves the tools at `/mcp`, over Streamable HTTP, to anything with an admin token:

```json
{
  "mcp": {
    "triage": {
      "type": "remote",
      "url": "https://triage.example.com/mcp",
      "headers": { "Authorization": "Bearer {env:TRIAGE_ADMIN_TOKEN}" }
    }
  }
}
```

## Home Assistant

The [Home Assistant app](/setup/server#home-assistant) announces its MCP server to Home Assistant, which offers to add it under **Settings > Devices & services**. Once it's added, turn on its tools for your conversation agent, and Assist can read, resolve, mute and label issues too.

Home Assistant reaches it on the app's ingress port, which lets Home Assistant Core use `/mcp` without a token. If Home Assistant can't connect, the app's log says which address it refused: set `TRIAGE_INGRESS_MCP_FROM` to it.
