Use this reference to interpret the diagnostic tools your application publishes.
The endpoint’s current tools/list and input schemas determine what the caller
can use; this inventory does not guarantee that every tool is registered or
available. Capture Setup owns publication and protection;
Application Diagnosis owns the investigation path.
Owner Prefixes
Factories return definitions over an existing owner’s state. They do not mount HTTP routes, authenticate callers, or start routers, schedulers, or standalone telemetry stores.
| Factory | Empty Prefix | Explicit Prefix |
|---|---|---|
composer.MCPTools |
Rejected before capture; requires a nonempty prefix. | "app" produces app.info, app.health, app.started, app.healthy, app.ready, app.events, app.traces, app.trace, app.logs, app.metrics; CLI group app. |
public.MCPTools on a router |
Protocol routes; CLI group router. |
"public" produces public.routes; CLI group public. |
scheduler.MCPTools |
Protocol entries, run; CLI group schedule. |
"jobs" produces jobs.entries, jobs.run; CLI group jobs. |
store.MCPTools on memory telemetry |
Protocol traces, trace, logs, metrics; CLI group telemetry. |
"memory" produces memory.traces, memory.trace, memory.logs, memory.metrics; CLI group memory. |
Application capture includes memory telemetry tools under the application prefix
directly, without another app or telemetry segment. Negative event retention
omits the events tool. Use distinct prefixes for multiple owners.
The CLI form is GROUP:OPERATION, such as app:logs; exact protocol names are
also callable. Tables below use CLI forms and exact JSON property names.
Properties are optional unless marked required. CLI flags use hyphens where
JSON uses underscores, such as --min-duration for min_duration; see
Calling Tools for input handling. Roles and annotations
describe capabilities but grant no access.
Application State
These tools use the explicit prefix app.
| Command | Inputs | Result |
|---|---|---|
app:info |
None. | Identity, build, lifecycle, and fresh Go runtime statistics; identity role. |
app:health |
fresh: boolean, default false. |
Overall status and check items; health role. Reads the cache unless fresh=true. |
app:started |
wait: boolean; timeout: duration. |
started, lifecycle state, optional started_at. Successful startup remains recorded after stopping. |
app:healthy |
wait: boolean; timeout: duration; fail_fast: boolean. |
Cached background status, optional checked_at, and checks; never executes checks. |
app:ready |
wait: boolean; timeout: duration; fail_fast: boolean. |
ready and a safe failure reason, using the readiness probe’s decision; never executes checks. |
app:events [NAME] |
name: string glob; since: duration; limit: integer; cursor: string; wait: duration. |
Oldest-first metadata page; absent when event retention is disabled. See Cursor Pages. |
After successful startup, info includes uptime, a Go duration string truncated
to whole seconds, and uptime_seconds, the elapsed whole seconds. Both are
omitted before startup completes. Runtime statistics include goroutines, heap
allocation and system memory in bytes and formatted text, GC count, and
gomaxprocs.
Health statuses are ok, pending, failing, and stale. Cached individual
check records preserve their last verdict, transition time, and check time even
when the overall report becomes stale. Health does not include lifecycle
liveness; use readiness for the traffic decision. With no registered checks,
health can be ok without proving dependencies work.
fresh=true executes every registered check with the caller context and the
configured readiness timeout. It does not update the background readiness cache
or publish health transitions. The call waits for all callbacks; deadlines
cannot forcibly interrupt application code that ignores cancellation.
Event name uses Go path.Match syntax, such as billing.*, not the event bus’s
subscription-pattern syntax. since is a nonnegative duration relative to each
call; zero has no age restriction. Event pages default to 100 items and accept
normalized limits of 1–1000. Records contain time, age, name, payload_type,
and optional trace_id, never payload values.
Condition Waits
Conditions observe immediately unless wait=true. An immediate false condition
is successful structured output, not a failed gate. Omitted or zero timeout
selects a 30-second wait budget; a nonzero timeout requires waiting. Durations
are nonnegative Go duration strings.
For example, this is the JSON input for a readiness wait, not a dependency check:
{
"wait": true,
"timeout": "30s"
}
The tool returns when ready, or fails with the final safe observation. For CLI gating and transport timeout handling, use Waiting and Following.
Healthy and ready also accept fail_fast=true, which requires wait=true.
Fail-fast stops on a fresh failed background pass, including an already cached
pass that remains fresh. Pending or stale health continues waiting. Without
fail-fast, checks can recover during the wait budget. Started has no fail-fast
input. An already satisfied condition succeeds even in a terminal lifecycle.
Condition Failures
Safe tool failures travel in result _meta["arkoren.dev/failure"], not successful
structured content. The CLI treats them as failures.
| Code | Meaning |
|---|---|
invalid_input |
Nonzero timeout without waiting, or fail-fast without waiting. Schema validation can reject other invalid inputs before execution. |
condition_timeout |
The server wait budget expired; details contain the last observation as result. |
condition_stopped |
Failed, stopping, or stopped lifecycle prevents an unsatisfied condition from completing; details contain result. |
condition_failed |
Fail-fast observed a fresh failed background health pass; details contain the operation’s result and safe checks. |
Caller cancellation or client deadline expiry can end the request without one
of these typed responses. Health failure text is withheld unless application
HealthDetails permits disclosure. That same setting affects verbose HTTP
readiness and fail-fast check details; it is not endpoint authorization.
Telemetry Records
These examples use application group app. A standalone memory store uses its
own prefix or the default telemetry group. Durations are nonnegative Go
duration strings; zero removes the age or minimum-duration restriction. Trace
and log limits normalize to 1–1000; omission or zero selects the listed default.
| Command | Inputs | Result And Limits |
|---|---|---|
app:traces |
status: error or ok; route: string; name: string; min_duration, since: durations; limit: integer. |
Newest-first summaries in items, default 20; truncated means matching summaries were omitted. |
app:trace ID |
Required id: 8–32 hex digits, case-insensitive. |
One uniquely matching trace’s finished-span tree in roots, joined logs, and orphan_logs. |
app:logs |
level: debug, info, warn, or error; trace_id: 8–32 hex digits; since: duration; limit: integer; cursor: string; wait: duration. |
Oldest-first cursor page, default 100; level is a minimum severity, trace ID is a case-insensitive prefix filter. |
app:metrics [NAME] |
name: instrument-name prefix. |
Retained aggregates in items, including scope, kind, units, label keys, and points; not a query to an external metrics backend. |
For traces, route exactly matches the root’s http.route or span name; name
matches a substring of any retained span’s name. min_duration tests the root’s
duration; since tests trace start age. A summary reports root duration,
retained span and error counts, status, and optional HTTP status and error type.
Summary status is error if any retained span ended in error; otherwise ok.
A trace tree can have multiple roots when parents are remote or evicted. Retained logs whose spans are unfinished or evicted appear as orphans. Log prefix filtering does not require a unique trace match; trace lookup does.
| Lookup Failure | Meaning And Recovery |
|---|---|
trace_not_found |
No retained trace matches. Check the full ID and capture history; eviction or missing capture is not proof no work occurred. |
ambiguous_trace |
Several retained traces match. Supply a longer prefix or full ID. |
Neither failure discloses candidate IDs. Malformed IDs are rejected by input validation rather than treated as trace absence.
Router Tools
With prefix public, the router publishes public:routes [PATH]. Its string
inputs are path, a case-sensitive registered-pattern prefix, and method, a
case-insensitive HTTP method. Omit either filter to accept all its values.
For example, this JSON input selects registered GET patterns under /invoices:
{
"method": "GET",
"path": "/invoices"
}
The result contains every match in registration order, with handler identity
and optional source location. truncated is always false. This reads the live
registry, including routes added after tool construction; it does not resolve a
concrete URL or execute a handler.
Scheduler Tools
These commands require prefix jobs.
| Command | Inputs | Result |
|---|---|---|
jobs:entries |
None. | All entries in registration order: cron spec, description, timeout, overlap setting, and optional next-run time. truncated is false; this is configuration, not execution history. |
jobs:run NAME |
Required name: string identifying an existing entry. |
Executes once and waits; success reports name, start time, and duration. |
run is non-idempotent application execution, not an inspection read. Publish
and invoke it only with explicit operator authorization, established overlap
safety, and a duplicate-effect policy. Entry timeouts and caller cancellation
apply cooperatively; driver-owned overlap guards do not apply. A callback that
ignores cancellation can keep the call from returning.
Only a failed entry lookup produces safe not_found. An existing entry’s error
remains an execution failure subject to adapter redaction, including an error
wrapping schedule.ErrUnknownName from a nested call. Never automatically retry
after failure or a lost response: neither proves that effects were undone.
Use the authorized action path to
decide whether execution is appropriate.
Cursor Pages
Only application events and memory logs advertise cursor following. Their
wait input is a duration string, unlike conditions’ boolean wait.
Without a cursor, the tool returns the newest matching history up to limit,
ordered oldest first. Its cursor anchors at the current end of the store, not
at the first page of a historical export. Older matches omitted by that
snapshot cannot be retrieved by following its cursor.
To skip history, supply cursor: "tail". For example, the following input to
app.logs immediately anchors an error-log query:
{
"level": "error",
"cursor": "tail"
}
The result is an empty items array and an opaque cursor. Send that returned
cursor unchanged to the same tool with the same filters to read new records.
You can change page size and wait without changing the query. Keep since
unchanged too; its relative age cutoff is evaluated anew for each call.
wait ranges from 0s to 25s and bounds an idle continuation. Initial
snapshots and tail anchors return immediately regardless of that budget.
Nonmatching arrivals do not extend the fixed deadline. All calls remain
cancelable.
| Field | Interpretation |
|---|---|
items |
Matching records, oldest first; never null. |
cursor |
Next opaque position, even on an empty page; not an authorization token. |
truncated |
An initial snapshot omitted older matching history; following cannot page backward. |
dropped |
Records overwritten since the supplied position, possibly including nonmatches. |
has_more |
Retained matching records remain; drain another page without waiting. Nonmatching records also advance the position. |
instance_changed |
Reset or replacement detected; this response is empty with a fresh tail cursor, not a mixture of store generations. |
If instance_changed is true and you need the new store’s history, make a
separate snapshot request. Do not treat it as uninterrupted continuation.
Malformed, wrong-tool, wrong-filter, and future-position cursors return safe
invalid_cursor. Invalid limits or waits can yield invalid_input or an input
schema failure. Do not silently restart after failure and label the output
complete.
Store generations do not survive reset or replacement, and rings can evict records between polls. CLI following reports loss and restart notices, but does not reconnect or persist cursor checkpoints.
Capture Limits
Attach application capture once during composition. Application telemetry recording starts after successful composition; event metadata capture starts when its listener is attached. New capture defaults are:
| Signal | Retained Capacity |
|---|---|
| Spans | 2000 finished spans. |
| Logs | 5000 records. |
| Metrics | 1000 distinct label combinations per instrument. |
| Events | 500 metadata records. |
Zero CaptureLimits fields select defaults; negative fields disable retention.
Existing configured memory telemetry retains its own capacities. Standalone
memory stores follow their builder limits and require their own lifecycle;
calling their tool factory does not start them. Capture does not configure an
exporter or itself start the primary telemetry driver.
These are bounded, process-local observations, not a durable audit trail or export. Tools do not show unfinished spans and cannot recover unrecorded or evicted evidence. Event payload values are excluded, but names, types, and trace IDs still disclose application structure. Route metadata exposes handler identities and source paths. Log text, telemetry attributes, and approved health details can contain private data; protect the endpoint and saved output. Follow Telemetry Privacy when instrumenting application code.
Custom diagnostics use ordinary MCP tool definitions, not a separate inspector extension system. Factory declarations are in the application, memory telemetry, router, and schedule APIs.