Agent tools
Agent tools
cboxdk/laravel-telemetry-ui serves an MCP server — read-only tools over
the traces, logs and metrics. This package adds the issue ledger to it, so
an assistant that can already read what happened can also see what the
team has decided about it, and make a decision of its own on the team's
behalf.
There is nothing to wire up: the tools are registered on the dashboard's server when both packages are enabled.
php artisan mcp:start telemetry-ui # stdio, for a local assistant
or the dashboard's web endpoint, when telemetry-ui.mcp.web.enabled is on.
The tools
| Tool | Does |
|---|---|
list_issues |
The working list, open first. Filters: status (effective — a lapsed snooze is open), kind (one kind, or scheduled for every scheduled-task kind), service. Pages with limit/offset; answers total and next_offset |
show_issue |
One issue as Markdown: fingerprint, kind, status, first and last seen, resolution, the latest trace id and — for an error group — occurrences and affected users over the last 24 hours, read live from the store. Ends with the history |
resolve_issue |
Mark it fixed, with an optional comment and release |
ignore_issue |
Never announce it again, with an optional comment |
reopen_issue |
Back on the working list, with an optional comment |
archive_issue |
Quiet until it escalates (error groups only) — see issues |
profiling_rotation |
Read-only: what the profiling rotation and ad-hoc directives placed, which are active, the settings; next=true ranks the next picks |
request_directive |
Keep (and optionally profile) one slice of a monitored app's traffic for a while: match route/path/user/context/job, value, key for context, minutes, profile, reason, service |
Every tool accepts a unique prefix of a fingerprint; an ambiguous one is
refused rather than guessed at. Output is built for a reader that pays per
token: empty keys are left out, long messages are cut in the list, and
show_issue has the rest.
A skill for the agent (Laravel Boost)
The package ships an agent skill, telemetry-insights-triage, at
resources/boost/skills/telemetry-insights-triage/SKILL.md, the path
Laravel Boost
reads in third-party packages. It teaches the agent the triage loop: the
open list, show_issue, the latest trace into telemetry-ui's
trace_summary, and which decision tool fits, with a comment written for
the next reader. It also says when not to change a status: only when asked
to act on the ledger, never while merely investigating.
Run php artisan boost:install (Boost 2.x), choose Agent Skills, and
tick cboxdk/laravel-telemetry-insights in the third-party list. Boost
only reads direct dependencies, so the dashboard's telemetry-ui-mcp skill
and laravel-telemetry's own skills come with them only when the app
requires cboxdk/laravel-telemetry-ui and cboxdk/laravel-telemetry
itself.
Who did it
Every change is written to the issue's history
as made via agent, with the comment the agent gave and — when the
transport has a signed-in user — that user's email, name or id.
show_issue prints the history, so the next reader sees "Resolved via
agent by [email protected] — 'retry added in v2.4.1'" rather than a
status that changed with no explanation.
Authorization
- Reading follows the dashboard's tenancy lock: a viewer locked to some services or environments sees only those issues, and a lock to nothing shows nothing. Error groups carry no environment, so a viewer whose environments are locked does not see them — it cannot be shown they are theirs.
- Changing takes
manageTelemetryUi, the ability the dashboard's own write API checks, evaluated for the transport's user. With no user, only the local stdio server is trusted — it runs under artisan, for someone who could runtelemetry-insights:issuein the same shell. An HTTP request with no user is refused. request_directiveis a write too, with the same gate. A viewer locked to some services may only target those, and must name one. A viewer locked to some environments cannot request directives at all — targets are keyed by service, so a directive cannot be held to an environment — and sees no profiling runs inprofiling_rotationor on the Profiling page.telemetry-insights.mcp.writes = falseregisters the read tools only;telemetry-insights.mcp.enabled = falseregisters none.
Headless
The tools ride on the dashboard's MCP server, so an app running
TELEMETRY_UI_ENABLED=false has none — the same as the
HTTP API. The IssueActions service and the artisan
commands remain.