Skip to main content
Glama
Thecimal

Quantified Self MCP Server

Get metric baseline

get_baseline
Read-onlyIdempotent

Compute "what's normal" for one metric over a window: mean, median, and standard deviation. This is the number every other analytics tool below measures against, so a wider window (60-90+ days) gives a more stable baseline than the 30-day…

Instructions

Compute "what's normal" for one metric over a window: mean, median, and standard deviation. This is the number every other analytics tool below measures against, so a wider window (60-90+ days) gives a more stable baseline than the 30-day default read_health_data uses.

Use this tool when:

  • the user asks what's normal/typical/usual for one metric (e.g. "what's normal for my resting heart rate?"), with no particular day or direction of change in mind.

Do not use this tool when:

  • the user asks whether a metric is going up/down over time -> use calculate_metric_trend instead.

  • the user asks whether specific days looked unusual -> use detect_metric_anomalies instead.

  • the user wants two ranges compared against each other -> use compare_metric_periods 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
metricYesOne of steps, sleep_hours, resting_heart_rate, weight_kg, workout_minutes, mood, water_ml, heart_rate, hrv_ms.
end_dateNoLast day to include, formatted YYYY-MM-DD. Defaults to today.
start_dateNoFirst day to include, formatted YYYY-MM-DD. Defaults to 90 days before end_date.

Output Schema

NameRequiredDescriptionDefault
claimYesEvidence and decision for the "what's normal" claim; read claim.decision before reporting it.
rangeYes
metricYes
baselineYes
evidenceYesDEPRECATED: identical to claim.evidence. Use claim.decision, not evidence.confidence.
data_healthNoWhether the data behind this baseline is complete, current and trustworthy.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.0.30
    • changedOutput schema / properties / data_health / anyOf
      Previous value: -[
      -  {
      -    "description": "Data-quality state behind one result (not a medical or statistical confidence score). status is one of\nVALID, VALID_WITH_GAPS, INSUFFICIENT_DATA, STALE, IMPORT_INCOMPLETE; reasons lists every condition 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"
      -  }
      -]New value: +[
      +  {
      +    "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"
      +  }
      +]
  2. Changed1 schema field changedv1.0.29
    • 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, INSUFFICIENT_DATA, STALE, IMPORT_INCOMPLETE; reasons lists every condition 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 this baseline is complete, current and trustworthy."
      +}
  3. Changed4 schema fields changedv1.0.24
    • addedOutput schema / properties / claim
      Added value: +{
      +  "description": "Evidence and decision for the \"what's normal\" 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 / evidence / deprecated
      Added value: +true
    • changedOutput schema / 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."
    • changedOutput schema / required
      Previous value: -[
      -  "metric",
      -  "range",
      -  "baseline",
      -  "evidence"
      -]New value: +[
      +  "metric",
      +  "range",
      +  "baseline",
      +  "claim",
      +  "evidence"
      +]
  4. Changed2 schema fields changed
    • addedOutput schema / 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 / required
      Previous value: -[
      -  "metric",
      -  "range",
      -  "baseline"
      -]New value: +[
      +  "metric",
      +  "range",
      +  "baseline",
      +  "evidence"
      +]
  5. Addedv1.0.16
  6. Removedv1.0.15
  7. Addedv1.0.11

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, closed-world, non-destructive), and the description adds real behavioral context beyond them: window-length stability guidance implying a wider window is safer, that the tool is the reference point other analytics compare against, and an explicit privacy disclosure about data entering a cloud-hosted conversation.

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?

Front-loads the core computation, then structured when/when-not blocks, closing with a privacy note. The privacy paragraph is long but non-redundant and genuinely actionable, so little is wasted even if the whole is verbose.

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?

With an output schema present, return values need not be described. The description covers purpose, selection criteria, alternatives, window sizing, and a disclosure about data propagation, leaving no obvious gap for correct invocation.

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 description coverage is 100%, so the schema already documents metric enum values and date formats, establishing the baseline of 3. The description adds window-sizing advice (60-90+ days) that guides start_date, but it frames this against read_health_data's default rather than this tool's own 90-day default, so the value added is modest and slightly oblique.

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 (compute) and resource (baseline statistics: mean, median, standard deviation) for a single metric over a window, and distinguishes itself from the sibling tools that measure against it. An agent can tell immediately what this returns.

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?

Provides explicit 'use this tool when' and 'do not use this tool when' blocks, each negative case routed to a named alternative (calculate_metric_trend, detect_metric_anomalies, compare_metric_periods) with the discriminating user intent spelled out.

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