{"id":51430141,"url":"https://github.com/msradam/triage-agent","last_synced_at":"2026-07-05T03:03:17.705Z","repository":{"id":360111409,"uuid":"1248739296","full_name":"msradam/triage-agent","owner":"msradam","description":"A support-triage MCP agent built with BurrMCP: investigate before you decide, enforced by the state-machine graph.","archived":false,"fork":false,"pushed_at":"2026-05-25T03:03:48.000Z","size":1023,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T04:27:08.173Z","etag":null,"topics":["apache-burr","burrmcp","example","llm-agents","mcp","model-context-protocol","state-machine"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/msradam.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-25T02:20:24.000Z","updated_at":"2026-05-25T03:03:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/msradam/triage-agent","commit_stats":null,"previous_names":["msradam/triage-agent"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/msradam/triage-agent","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msradam%2Ftriage-agent","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msradam%2Ftriage-agent/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msradam%2Ftriage-agent/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msradam%2Ftriage-agent/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/msradam","download_url":"https://codeload.github.com/msradam/triage-agent/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/msradam%2Ftriage-agent/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35141967,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apache-burr","burrmcp","example","llm-agents","mcp","model-context-protocol","state-machine"],"created_at":"2026-07-05T03:03:08.058Z","updated_at":"2026-07-05T03:03:17.686Z","avatar_url":"https://github.com/msradam.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# triage-agent\n\nA support-ticket triage agent built with\n[Theodosia](https://github.com/msradam/theodosia): a triage workflow defined as a\n[Burr](https://burr.dagworks.io/) state machine and served as an\n[MCP](https://modelcontextprotocol.io/) server. An LLM classifies the ticket,\ngathers context, and decides, one enforced transition at a time.\n\n```mermaid\nstateDiagram-v2\n    [*] --\u003e classify\n    classify --\u003e gather_context\n    gather_context --\u003e gather_context\n    gather_context --\u003e resolve\n    gather_context --\u003e escalate\n    resolve --\u003e [*]\n    escalate --\u003e [*]\n```\n\nThis diagram is the contract. The agent can only move along these edges; the\nserver refuses any step that is not a reachable transition. The gate is\nstructural: there is no edge from `classify` straight to `resolve` or\n`escalate`, so an agent that tries to close a ticket before gathering any\ncontext gets a refusal. This is the step up from a toy: a real \"investigate\nbefore you decide\" policy, enforced by the graph rather than asked of the model.\n\nAn LLM drives it over MCP. Here fast-agent connects a Llama-3.3-70B model\n(on Together); when the model calls an action with the wrong inputs, the server\nreturns a structured error and the model corrects itself:\n\n![triage-agent driven by an LLM](demos/triage-agent-agent.gif)\n\nThe same workflow is observable from the terminal. `triage-agent render` prints\nthe graph; `triage-agent sessions show` replays a recorded run:\n\n![triage-agent observability](demos/triage-agent.gif)\n\n## Install\n\n```bash\ngit clone https://github.com/msradam/triage-agent.git\ncd triage-agent\nuv venv --python 3.13\nuv pip install -e .\n```\n\n## Run it as an agent\n\nThe repo ships an `.mcp.json` pointing a client at `triage-agent serve`.\n\n### Claude Code\n\n```bash\nclaude mcp add --transport stdio triage-agent -- uv run triage-agent serve\nclaude\n```\n\nThen: \"A customer was double-charged. Triage it.\" Claude classifies, records\nfindings with `gather_context`, then resolves or escalates.\n\n### fast-agent (terminal REPL)\n\nThe repo ships a `fastagent.config.yaml` defining this server, so:\n\n```bash\nuvx fast-agent-mcp go --servers triage-agent -m \"A customer was double-charged. Triage it.\"\n```\n\nIt uses Gemini by default (set `GOOGLE_API_KEY`). To drive it with a Together\nmodel instead, set `GENERIC_API_KEY` and add\n`--model generic.meta-llama/Llama-3.3-70B-Instruct-Turbo`.\n\n### MCPJam (one npx command, browser playground, free models)\n\n```bash\nnpx @mcpjam/inspector\n```\n\nAdd the server with command `uv`, args `run triage-agent serve`.\n\n## Watch what it did\n\n```bash\nuv run triage-agent sessions show     # per-step timeline; refused decisions in red\nuv run triage-agent watch             # live-tail\n```\n\nEvery step and refusal is also hash-chained into a tamper-evident `ledger.jsonl`\nnext to the session's tracker log. Recompute the chain and confirm nothing was\nedited, reordered, or deleted after the fact with:\n\n```bash\nuv run triage-agent verify            # exits nonzero and names the broken line if the chain is altered\n```\n\n## License\n\nApache 2.0. Built on [Theodosia](https://github.com/msradam/theodosia),\n[Apache Burr](https://github.com/apache/burr), and\n[FastMCP](https://github.com/jlowin/fastmcp).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmsradam%2Ftriage-agent","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmsradam%2Ftriage-agent","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmsradam%2Ftriage-agent/lists"}