outcomeisokis_emptyis false- no retry followed within 30 seconds
ok rate and a low first-call rate, and only the second one tells you there is a problem.
How a retry is detected
Within one session, find the sametool_name called twice within 30 seconds. Then the args_hash decides:
That distinction is the whole reason
args_hash exists. Without it, a paginating client would look like a model in distress.
The hash is twelve characters of a SHA-256 over the arguments with keys sorted. It cannot be reversed, and the sorting is what stops the same arguments in a different order from looking like a different request. See What is sent.
Sessions have to be real for this to work
Retries are detected within one session. If every request opens a new session, there is never a second call to compare against and the rate reads 100% forever. On streamable HTTP this is the mistake to avoid: the SDK shares one session and one buffer per process precisely so that calls stay grouped, even though a freshMcpServer is built per request.
It lags by one day
Retries and first-call success are computed by the nightly pass at 02:00 UTC, which walks each session’s calls in order and applies the rule above. Today’s rows are always zero until it runs. So the metric is reported strictly through yesterday and labelled as of yesterday. Including today in the denominator would drag the number down every morning and recover it every night, and a figure that moves on its own is worse than one that is a day old. Two consequences:- The denominator is calls on days the pass has covered, not all calls in range. A range that is entirely today has no rate at all.
- A range with calls but no covered days returns
null, which renders as not yet computed rather than0%. A zero there would claim every call failed.
Reading the number
The retries figure sits directly under the card because it is the metric that moves this one.
Per tool, the same rate appears in the tool health table and drives its status badge.