Skip to main content
Glama
README.md
# triage-mcp

An MCP server over my [ai-triage-agent](https://github.com/aminafara123/ai-triage-agent) queue. A local LLM classifies support tickets and drafts replies, a human approves or rejects every one, and this server lets any MCP-capable AI client read that queue and the decision log.

It answers questions like "whats waiting for review?" or "what did I reject this week and why?" straight from the files the agent writes. Four tools, all read-only. The model can look at the queue but it cant approve, reject or send anything.

## Tools

| Tool | What it does |
|---|---|
| `queue_status()` | Counts for inbox, pending review by priority, outbox and logged decisions |
| `pending_items(priority)` | Tickets waiting for review, most urgent first, optional priority filter |
| `recent_decisions(limit)` | Latest human decisions from the audit log, newest first |
| `search_decisions(query)` | Search the decision log by id, outcome, category, priority or reject reason |

## Setup

```bash
pipx install triage-mcp
```

`uvx triage-mcp` works too if you prefer no install. Hacking on a clone instead:

```bash
python3 -m venv .venv
.venv/bin/pip install mcp
```

It reads `~/aiProjects/aminWork/automation-portfolio/ai-triage-agent/`. Point `TRIAGE_DATA_DIR` at your own data folder if your copy lives somewhere else.

Wire it into Claude Code:

```bash
claude mcp add triage -- triage-mcp
```

Running from a clone, point it at the venv instead:

```bash
claude mcp add triage -- /path/to/triage-mcp/.venv/bin/python /path/to/triage-mcp/triage_mcp.py
```

## Demo

What it looks like from Claude Code:

```
> anything urgent sitting in the triage queue?

⏺ triage · pending_items()

  2 pending item(s):
  demo-014 P1 security_incident -> security-team (high): User entered their password on a fake helpdesk link and asks what to do next.
  demo-017 P3 software_issue -> service-desk (medium): Spreadsheet app crashes when opening one monthly report file.

⏺ One P1. demo-014 looks like a phishing hit and is routed to security.
  Id review that one first. The Excel crash can wait.
```

The tickets above are demo data. The format is exactly what the server returns.

## Design notes

- **Read-only by construction.** No tool writes to the queue, the outbox or the log. Approving stays in `review.py` with a human at the keyboard.
- **Only metadata crosses the protocol.** Ticket bodies, extracted entities and reply text never leave the server. Summaries and reject reasons are cut to 100 characters with emails and home paths masked.
- **Small on purpose.** One file, standard library plus the `mcp` SDK.

## Honest notes

- It only reads what ai-triage-agent has already written. With an empty `pending/` folder most answers are zeros, which is normal between triage runs.
- The masking is regex based. It catches emails and home paths, not names written into a summary.
- All ticket content in the demo and the tests is made up. The logic is tested against a synthetic queue in `test_server.py`. Run `python test_server.py`.

## About

Al Amin Bashir Afara, Dubai · [github.com/aminafara123](https://github.com/aminafara123) · [linkedin.com/in/aminafara](https://www.linkedin.com/in/aminafara)

TDQS

A3.5/5.0

Scored across 4 tools

Disambiguation4/5

Each tool has a distinct primary purpose: queue_status gives counts, pending_items lists reviewable tickets, recent_decisions browses the audit log, and search_decisions queries that same log. There is mild overlap between queue_status/pending_items and between recent_decisions/search_decisions, but the descriptions clearly separate them.

Naming Consistency4/5

All names use consistent snake_case and follow a two-part modifier+noun pattern (queue_status, pending_items, recent_decisions, search_decisions). The only minor deviation is search_decisions using a verb_noun form while the others are noun/noun or adjective/noun.

Tool Count5/5

Four tools is well-scoped for a read-oriented triage inspection/audit server. Each tool covers a distinct facet (status counts, pending list, recent decisions, decision search) without redundancy.

Completeness3/5

The surface covers read/inspection operations well, but there is no tool to submit a decision (approve, edit, reject) or otherwise act on a ticket. For a triage workflow, that is a notable missing write operation that limits the set to monitoring only.

Maintenance

ActivityMaintained
ResponsivenessNo issues