Skip to main content
Glama
Thecimal

Quantified Self MCP Server

Get recent changes

get_recent_changes
Read-onlyIdempotent

Scan every (non-private) metric for what's changed lately: a recent period vs. the four-times-as-long period before it (period-over-period shift), any anomalies inside the recent period, and a trend over it.

Instructions

Scan every (non-private) metric for what's changed lately: a recent period vs. the four-times-as-long period before it (period-over-period shift), any anomalies inside the recent period, and a trend over it. The single best tool to start a "how have I been doing?" conversation with — it does the scanning across all metrics that would otherwise take one get_baseline/detect_metric_anomalies/calculate_metric_trend call per metric.

Do not use this tool when:

  • the user already named a specific metric and wants the full why-bundle for it (value, baseline, anomaly flag, trend, correlated metrics) -> use explain_metric_change instead.

Privacy note: this server and its SQLite file are entirely local, but the data returned by this tool becomes part of the conversation sent to whatever model the calling client is configured with. If that model runs in the cloud rather than on your machine, treat this the same as pasting the data into a chat with that provider.

Input Schema

NameRequiredDescriptionDefault
daysNoLength of the "recent" window in days (default 7). The comparison baseline is the 4x-as-long period immediately before it, so a 7-day recent window compares against the preceding 28 days.

Output Schema

NameRequiredDescriptionDefault
changesYes
data_healthNoWhether the data behind these changes is complete and current (the weakest metric window).
recent_rangeYes
baseline_rangeYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.0.30
    • addedOutput schema / properties / data_health
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Data-quality state behind one result (not a medical or statistical confidence score). status is one of\nVALID, VALID_WITH_GAPS, MIXED_SOURCES, INSUFFICIENT_DATA, STALE, IMPORT_INCOMPLETE; reasons lists every\ncondition that\napplies. See data_health.compose_data_health for how it is decided.",
      +      "properties": {
      +        "completeness": {
      +          "properties": {
      +            "coverage_ratio": {
      +              "type": "number"
      +            },
      +            "expected_days": {
      +              "type": "integer"
      +            },
      +            "missing_days": {
      +              "type": "integer"
      +            },
      +            "observed_days": {
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "expected_days",
      +            "observed_days",
      +            "coverage_ratio",
      +            "missing_days"
      +          ],
      +          "type": "object"
      +        },
      +        "coverage": {
      +          "properties": {
      +            "end": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null
      +            },
      +            "requested_end": {
      +              "type": "string"
      +            },
      +            "requested_start": {
      +              "type": "string"
      +            },
      +            "start": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null
      +            }
      +          },
      +          "required": [
      +            "requested_start",
      +            "requested_end"
      +          ],
      +          "type": "object"
      +        },
      +        "freshness": {
      +          "properties": {
      +            "age_days": {
      +              "anyOf": [
      +                {
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null,
      +              "description": "Days from the latest observation to the end of the requested window."
      +            },
      +            "dataset_days_behind": {
      +              "anyOf": [
      +                {
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null,
      +              "description": "Days from the dataset's latest data (any metric) to today."
      +            },
      +            "latest_data": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "gaps": {
      +          "items": {
      +            "properties": {
      +              "days": {
      +                "type": "integer"
      +              },
      +              "end": {
      +                "type": "string"
      +              },
      +              "start": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "start",
      +              "end",
      +              "days"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "last_import": {
      +          "anyOf": [
      +            {
      +              "properties": {
      +                "finished_at": {
      +                  "anyOf": [
      +                    {
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ],
      +                  "default": null
      +                },
      +                "importer": {
      +                  "type": "string"
      +                },
      +                "source_file": {
      +                  "anyOf": [
      +                    {
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ],
      +                  "default": null
      +                },
      +                "status": {
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "importer",
      +                "status"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "last_successful_import": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "observations": {
      +          "description": "Number of daily values the result is computed from.",
      +          "type": "integer"
      +        },
      +        "reasons": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "status": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "status",
      +        "reasons",
      +        "freshness",
      +        "coverage",
      +        "completeness",
      +        "gaps",
      +        "observations"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Whether the data behind these changes is complete and current (the weakest metric window)."
      +}
  2. Changed3 schema fields changedv1.0.28
    • removedOutput schema / properties / changes / items / properties / claim_decision
      Removed value: -{
      -  "deprecated": true,
      -  "description": "DEPRECATED: identical to claim.decision. Use claim.decision instead.",
      -  "properties": {
      -    "must_state": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "permitted_phrasing_class": {
      -      "type": "string"
      -    },
      -    "template": {
      -      "type": "string"
      -    },
      -    "tier": {
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "tier",
      -    "permitted_phrasing_class",
      -    "must_state",
      -    "template"
      -  ],
      -  "type": "object"
      -}
    • removedOutput schema / properties / changes / items / properties / evidence_profile
      Removed value: -{
      -  "deprecated": true,
      -  "description": "DEPRECATED: identical to claim.profile. Use claim.decision instead.",
      -  "properties": {
      -    "analysis": {
      -      "type": "string"
      -    },
      -    "dimensions": {
      -      "items": {
      -        "properties": {
      -          "can_block": {
      -            "default": true,
      -            "type": "boolean"
      -          },
      -          "details": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "dimension": {
      -            "enum": [
      -              "sample",
      -              "temporal",
      -              "robustness",
      -              "missingness",
      -              "practical",
      -              "measurement_validity",
      -              "provenance"
      -            ],
      -            "type": "string"
      -          },
      -          "reason_codes": {
      -            "items": {
      -              "type": "string"
      -            },
      -            "type": "array"
      -          },
      -          "status": {
      -            "enum": [
      -              "adequate",
      -              "negligible",
      -              "not_assessed",
      -              "weak",
      -              "concern",
      -              "blocking"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "dimension",
      -          "status"
      -        ],
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "effect": {
      -      "additionalProperties": true,
      -      "type": "object"
      -    },
      -    "metric": {
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "metric",
      -    "analysis",
      -    "dimensions"
      -  ],
      -  "type": "object"
      -}
    • changedOutput schema / properties / changes / items / required
      Previous value: -[
      -  "metric",
      -  "kind",
      -  "detail",
      -  "claim",
      -  "evidence",
      -  "evidence_profile",
      -  "claim_decision"
      -]New value: +[
      +  "metric",
      +  "kind",
      +  "detail",
      +  "claim",
      +  "evidence"
      +]
  3. Changed8 schema fields changedv1.0.27
    • addedOutput schema / properties / changes / items / properties / claim
      Added value: +{
      +  "description": "Evidence and decision for this change note's claim; read claim.decision before reporting it.",
      +  "properties": {
      +    "decision": {
      +      "description": "How strongly this claim may be stated. tier is insufficient, suggestive, detectable_not_meaningful or supported; every entry in must_state has to be mentioned when reporting it.",
      +      "properties": {
      +        "must_state": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "permitted_phrasing_class": {
      +          "type": "string"
      +        },
      +        "template": {
      +          "type": "string"
      +        },
      +        "tier": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "tier",
      +        "permitted_phrasing_class",
      +        "must_state",
      +        "template"
      +      ],
      +      "type": "object"
      +    },
      +    "evidence": {
      +      "description": "Descriptive data coverage behind this claim.",
      +      "properties": {
      +        "confidence": {
      +          "type": "string"
      +        },
      +        "coverage_ratio": {
      +          "type": "number"
      +        },
      +        "expected_days": {
      +          "type": "integer"
      +        },
      +        "freshness_days": {
      +          "anyOf": [
      +            {
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "gaps": {
      +          "items": {
      +            "properties": {
      +              "days": {
      +                "type": "integer"
      +              },
      +              "end": {
      +                "type": "string"
      +              },
      +              "start": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "start",
      +              "end",
      +              "days"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "measurement_count": {
      +          "type": "integer"
      +        },
      +        "missing_days": {
      +          "type": "integer"
      +        },
      +        "observed_days": {
      +          "type": "integer"
      +        },
      +        "observed_end": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "observed_start": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "recent_gap_days": {
      +          "type": "integer"
      +        },
      +        "requested_end": {
      +          "type": "string"
      +        },
      +        "requested_start": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "requested_start",
      +        "requested_end",
      +        "expected_days",
      +        "observed_days",
      +        "coverage_ratio",
      +        "missing_days",
      +        "measurement_count",
      +        "gaps",
      +        "recent_gap_days",
      +        "confidence"
      +      ],
      +      "type": "object"
      +    },
      +    "profile": {
      +      "description": "Per-dimension evidence quality behind this claim (sample, temporal, missingness, ...). Dimensions without an evaluator yet are 'not_assessed' and cap the claim, never count as adequate.",
      +      "properties": {
      +        "analysis": {
      +          "type": "string"
      +        },
      +        "dimensions": {
      +          "items": {
      +            "properties": {
      +              "can_block": {
      +                "default": true,
      +                "type": "boolean"
      +              },
      +              "details": {
      +                "additionalProperties": true,
      +                "type": "object"
      +              },
      +              "dimension": {
      +                "enum": [
      +                  "sample",
      +                  "temporal",
      +                  "robustness",
      +                  "missingness",
      +                  "practical",
      +                  "measurement_validity",
      +                  "provenance"
      +                ],
      +                "type": "string"
      +              },
      +              "reason_codes": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "status": {
      +                "enum": [
      +                  "adequate",
      +                  "negligible",
      +                  "not_assessed",
      +                  "weak",
      +                  "concern",
      +                  "blocking"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "dimension",
      +              "status"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "effect": {
      +          "additionalProperties": true,
      +          "type": "object"
      +        },
      +        "metric": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "metric",
      +        "analysis",
      +        "dimensions"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "evidence",
      +    "profile",
      +    "decision"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / changes / items / properties / claim_decision / deprecated
      Added value: +true
    • changedOutput schema / properties / changes / items / properties / claim_decision / description
      Previous value: -"How strongly this result may be stated. tier is insufficient, suggestive, detectable_not_meaningful or supported; every entry in must_state has to be mentioned when reporting it."New value: +"DEPRECATED: identical to claim.decision. Use claim.decision instead."
    • addedOutput schema / properties / changes / items / properties / evidence / deprecated
      Added value: +true
    • changedOutput schema / properties / changes / items / properties / evidence / description
      Previous value: -"Coverage/quality of the data a single-metric analytical result is\nbased on. See evidence.build_evidence for how each field is computed."New value: +"DEPRECATED: identical to claim.evidence. Use claim.decision, not evidence.confidence."
    • addedOutput schema / properties / changes / items / properties / evidence_profile / deprecated
      Added value: +true
    • changedOutput schema / properties / changes / items / properties / evidence_profile / description
      Previous value: -"Per-dimension evidence quality behind this result (sample, temporal, missingness, ...). Dimensions without an evaluator yet are 'not_assessed' and cap the claim, never count as adequate."New value: +"DEPRECATED: identical to claim.profile. Use claim.decision instead."
    • changedOutput schema / properties / changes / items / required
      Previous value: -[
      -  "evidence_profile",
      -  "claim_decision",
      -  "metric",
      -  "kind",
      -  "detail",
      -  "evidence"
      -]New value: +[
      +  "metric",
      +  "kind",
      +  "detail",
      +  "claim",
      +  "evidence",
      +  "evidence_profile",
      +  "claim_decision"
      +]
  4. Changed11 schema fields changedv1.0.23
    • removedOutput schema / properties / changes / items / properties / claim_decision / anyOf
      Removed value: -[
      -  {
      -    "properties": {
      -      "must_state": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "permitted_phrasing_class": {
      -        "type": "string"
      -      },
      -      "template": {
      -        "type": "string"
      -      },
      -      "tier": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "tier",
      -      "permitted_phrasing_class",
      -      "must_state",
      -      "template"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / changes / items / properties / claim_decision / default
      Removed value: -null
    • addedOutput schema / properties / changes / items / properties / claim_decision / properties
      Added value: +{
      +  "must_state": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "permitted_phrasing_class": {
      +    "type": "string"
      +  },
      +  "template": {
      +    "type": "string"
      +  },
      +  "tier": {
      +    "type": "string"
      +  }
      +}
    • addedOutput schema / properties / changes / items / properties / claim_decision / required
      Added value: +[
      +  "tier",
      +  "permitted_phrasing_class",
      +  "must_state",
      +  "template"
      +]
    • addedOutput schema / properties / changes / items / properties / claim_decision / type
      Added value: +"object"
    • removedOutput schema / properties / changes / items / properties / evidence_profile / anyOf
      Removed value: -[
      -  {
      -    "properties": {
      -      "analysis": {
      -        "type": "string"
      -      },
      -      "dimensions": {
      -        "items": {
      -          "properties": {
      -            "can_block": {
      -              "default": true,
      -              "type": "boolean"
      -            },
      -            "details": {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            "dimension": {
      -              "enum": [
      -                "sample",
      -                "temporal",
      -                "robustness",
      -                "missingness",
      -                "practical",
      -                "measurement_validity",
      -                "provenance"
      -              ],
      -              "type": "string"
      -            },
      -            "reason_codes": {
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            "status": {
      -              "enum": [
      -                "adequate",
      -                "negligible",
      -                "not_assessed",
      -                "weak",
      -                "concern",
      -                "blocking"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "dimension",
      -            "status"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "effect": {
      -        "additionalProperties": true,
      -        "type": "object"
      -      },
      -      "metric": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "metric",
      -      "analysis",
      -      "dimensions"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / changes / items / properties / evidence_profile / default
      Removed value: -null
    • addedOutput schema / properties / changes / items / properties / evidence_profile / properties
      Added value: +{
      +  "analysis": {
      +    "type": "string"
      +  },
      +  "dimensions": {
      +    "items": {
      +      "properties": {
      +        "can_block": {
      +          "default": true,
      +          "type": "boolean"
      +        },
      +        "details": {
      +          "additionalProperties": true,
      +          "type": "object"
      +        },
      +        "dimension": {
      +          "enum": [
      +            "sample",
      +            "temporal",
      +            "robustness",
      +            "missingness",
      +            "practical",
      +            "measurement_validity",
      +            "provenance"
      +          ],
      +          "type": "string"
      +        },
      +        "reason_codes": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "status": {
      +          "enum": [
      +            "adequate",
      +            "negligible",
      +            "not_assessed",
      +            "weak",
      +            "concern",
      +            "blocking"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "dimension",
      +        "status"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  "effect": {
      +    "additionalProperties": true,
      +    "type": "object"
      +  },
      +  "metric": {
      +    "type": "string"
      +  }
      +}
    • addedOutput schema / properties / changes / items / properties / evidence_profile / required
      Added value: +[
      +  "metric",
      +  "analysis",
      +  "dimensions"
      +]
    • addedOutput schema / properties / changes / items / properties / evidence_profile / type
      Added value: +"object"
    • changedOutput schema / properties / changes / items / required
      Previous value: -[
      -  "metric",
      -  "kind",
      -  "detail",
      -  "evidence"
      -]New value: +[
      +  "evidence_profile",
      +  "claim_decision",
      +  "metric",
      +  "kind",
      +  "detail",
      +  "evidence"
      +]
  5. Changed2 schema fields changedv1.0.20
    • addedOutput schema / properties / changes / items / properties / claim_decision
      Added value: +{
      +  "anyOf": [
      +    {
      +      "properties": {
      +        "must_state": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "permitted_phrasing_class": {
      +          "type": "string"
      +        },
      +        "template": {
      +          "type": "string"
      +        },
      +        "tier": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "tier",
      +        "permitted_phrasing_class",
      +        "must_state",
      +        "template"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "How strongly this result may be stated. tier is insufficient, suggestive, detectable_not_meaningful or supported; every entry in must_state has to be mentioned when reporting it."
      +}
    • addedOutput schema / properties / changes / items / properties / evidence_profile
      Added value: +{
      +  "anyOf": [
      +    {
      +      "properties": {
      +        "analysis": {
      +          "type": "string"
      +        },
      +        "dimensions": {
      +          "items": {
      +            "properties": {
      +              "can_block": {
      +                "default": true,
      +                "type": "boolean"
      +              },
      +              "details": {
      +                "additionalProperties": true,
      +                "type": "object"
      +              },
      +              "dimension": {
      +                "enum": [
      +                  "sample",
      +                  "temporal",
      +                  "robustness",
      +                  "missingness",
      +                  "practical",
      +                  "measurement_validity",
      +                  "provenance"
      +                ],
      +                "type": "string"
      +              },
      +              "reason_codes": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "status": {
      +                "enum": [
      +                  "adequate",
      +                  "negligible",
      +                  "not_assessed",
      +                  "weak",
      +                  "concern",
      +                  "blocking"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "dimension",
      +              "status"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "effect": {
      +          "additionalProperties": true,
      +          "type": "object"
      +        },
      +        "metric": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "metric",
      +        "analysis",
      +        "dimensions"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Per-dimension evidence quality behind this result (sample, temporal, missingness, ...). Dimensions without an evaluator yet are 'not_assessed' and cap the claim, never count as adequate."
      +}
  6. Changed2 schema fields changedv1.0.17
    • addedOutput schema / properties / changes / items / properties / evidence
      Added value: +{
      +  "description": "Coverage/quality of the data a single-metric analytical result is\nbased on. See evidence.build_evidence for how each field is computed.",
      +  "properties": {
      +    "confidence": {
      +      "type": "string"
      +    },
      +    "coverage_ratio": {
      +      "type": "number"
      +    },
      +    "expected_days": {
      +      "type": "integer"
      +    },
      +    "freshness_days": {
      +      "anyOf": [
      +        {
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "gaps": {
      +      "items": {
      +        "properties": {
      +          "days": {
      +            "type": "integer"
      +          },
      +          "end": {
      +            "type": "string"
      +          },
      +          "start": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "start",
      +          "end",
      +          "days"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "measurement_count": {
      +      "type": "integer"
      +    },
      +    "missing_days": {
      +      "type": "integer"
      +    },
      +    "observed_days": {
      +      "type": "integer"
      +    },
      +    "observed_end": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "observed_start": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "recent_gap_days": {
      +      "type": "integer"
      +    },
      +    "requested_end": {
      +      "type": "string"
      +    },
      +    "requested_start": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "requested_start",
      +    "requested_end",
      +    "expected_days",
      +    "observed_days",
      +    "coverage_ratio",
      +    "missing_days",
      +    "measurement_count",
      +    "gaps",
      +    "recent_gap_days",
      +    "confidence"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / changes / items / required
      Previous value: -[
      -  "metric",
      -  "kind",
      -  "detail"
      -]New value: +[
      +  "metric",
      +  "kind",
      +  "detail",
      +  "evidence"
      +]
  7. Addedv1.0.16
  8. Removedv1.0.15
  9. Addedv1.0.11

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/local, so the safety profile is covered. The description still adds real context beyond them: it discloses the scan is limited to non-private metrics, and the privacy note explains that returned data leaves the local SQLite store and enters the client's model context. Rate limits or response shape are not covered, but this is meaningfully more than the annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and the routing rule are front-loaded and waste-free; the privacy paragraph is longer than the tool's mechanics but carries non-redundant decision-relevant information. Slight verbosity in the multi-clause opening, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A single optional parameter, full annotations, and an output schema mean the description only needs to carry routing and privacy concerns — which it does. Use case, exclusion, and data-handling caveat are all present, so an agent has everything needed to select and call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single `days` parameter is fully documented in the schema, including the 4x baseline relationship. The description restates the same period-over-period mechanics rather than adding syntax or constraints, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (scan all non-private metrics for period-over-period shift, anomalies, and trend) and explicitly differentiates itself from three siblings by name. An agent can tell what this does and how it relates to get_baseline/detect_metric_anomalies/calculate_metric_trend without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the tool as the entry point for a 'how have I been doing?' conversation, and adds an explicit 'Do not use this tool when' clause routing the user to `explain_metric_change` when a specific metric is named. Both the when and the when-not are stated with named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.