Skip to main content
Glama

read_research_chronicle

Read-onlyIdempotent

Read stored research chronicles to load, list, diff, narrate, analyze, compare, or review milestones without re-running any search.

Instructions

Read stored Research Chronicles: load, list, diff, narrate, analyze, compare.

This is the read facade over chronicles created by build_research_chronicle. Chronicles persist across sessions, so you can revisit a topic weeks later and see precisely what moved. Because the evidence is already stored, analysis and comparison are instant and do not re-run any search.

Actions:

  • "load": read one revision (defaults to latest) in any output format

  • "list": list stored chronicles, most recently updated first

  • "diff": compare two revisions — added, not observed/removed from the later view, and updated entries, plus evidence churn, branch churn, and the audit status transition. Absence does not prove retirement.

  • "narrate": render evidence-backed Markdown where every claim carries its entry ID and article identifiers

  • "milestones": entry-type and status distribution, per-year activity, evidence quality, and landmark entries for one chronicle

  • "compare": compare 2-5 chronicles side by side, including the evidence articles they share

The required request discriminator makes invalid field combinations unrepresentable. compare takes one typed selection containing either 2-5 topic strings or 2-5 Chronicle IDs.

Returns: Markdown or JSON text depending on the action and output format.

Examples: read_research_chronicle(request={"action":"list"}) read_research_chronicle(request={"action":"load","chronicle_id":"remimazolam-9f2b1c4d","output":"tree"}) read_research_chronicle(request={"action":"diff","chronicle_id":"remimazolam-9f2b1c4d","from_revision":1}) read_research_chronicle(request={"action":"narrate","chronicle_id":"remimazolam-9f2b1c4d","mode":"full"}) read_research_chronicle(request={"action":"milestones","chronicle_id":"remimazolam-9f2b1c4d"}) read_research_chronicle(request={"action":"compare","selection":{"kind":"topics","values":["remimazolam","propofol"]}})

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
requestYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed58 schema fields changedv0.7.7
    • addedInput schema / $defs / ChronicleCompareRequest / properties / action / anyOf
      Added value: +[
      +  {
      +    "const": "compare",
      +    "title": "Action",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[cC][oO][mM][pP][aA][rR][eE])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleCompareRequest / properties / action / const
      Removed value: -"compare"
    • removedInput schema / $defs / ChronicleCompareRequest / properties / action / type
      Removed value: -"string"
    • addedInput schema / $defs / ChronicleCompareRequest / properties / selection / anyOf
      Added value: +[
      +  {
      +    "discriminator": {
      +      "mapping": {
      +        "chronicle_ids": "#/$defs/ChronicleIdsSelection",
      +        "topics": "#/$defs/ChronicleTopicsSelection"
      +      },
      +      "propertyName": "kind"
      +    },
      +    "oneOf": [
      +      {
      +        "$ref": "#/$defs/ChronicleTopicsSelection"
      +      },
      +      {
      +        "$ref": "#/$defs/ChronicleIdsSelection"
      +      }
      +    ],
      +    "title": "Selection"
      +  },
      +  {
      +    "contentMediaType": "application/json",
      +    "contentSchema": {
      +      "discriminator": {
      +        "mapping": {
      +          "chronicle_ids": "#/$defs/ChronicleIdsSelection",
      +          "topics": "#/$defs/ChronicleTopicsSelection"
      +        },
      +        "propertyName": "kind"
      +      },
      +      "oneOf": [
      +        {
      +          "$ref": "#/$defs/ChronicleTopicsSelection"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleIdsSelection"
      +        }
      +      ],
      +      "title": "Selection"
      +    },
      +    "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.",
      +    "maxLength": 1000000,
      +    "type": "string"
      +  },
      +  {
      +    "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.",
      +    "maxLength": 1000000,
      +    "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$",
      +    "type": "string",
      +    "x-pubmed-decodedSchema": {
      +      "discriminator": {
      +        "mapping": {
      +          "chronicle_ids": "#/$defs/ChronicleIdsSelection",
      +          "topics": "#/$defs/ChronicleTopicsSelection"
      +        },
      +        "propertyName": "kind"
      +      },
      +      "oneOf": [
      +        {
      +          "$ref": "#/$defs/ChronicleTopicsSelection"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleIdsSelection"
      +        }
      +      ],
      +      "title": "Selection"
      +    },
      +    "x-pubmed-encoding": "fenced-json"
      +  }
      +]
    • removedInput schema / $defs / ChronicleCompareRequest / properties / selection / discriminator
      Removed value: -{
      -  "mapping": {
      -    "chronicle_ids": "#/$defs/ChronicleIdsSelection",
      -    "topics": "#/$defs/ChronicleTopicsSelection"
      -  },
      -  "propertyName": "kind"
      -}
    • removedInput schema / $defs / ChronicleCompareRequest / properties / selection / oneOf
      Removed value: -[
      -  {
      -    "$ref": "#/$defs/ChronicleTopicsSelection"
      -  },
      -  {
      -    "$ref": "#/$defs/ChronicleIdsSelection"
      -  }
      -]
    • addedInput schema / $defs / ChronicleDiffRequest / properties / action / anyOf
      Added value: +[
      +  {
      +    "const": "diff",
      +    "title": "Action",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[dD][iI][fF][fF])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleDiffRequest / properties / action / const
      Removed value: -"diff"
    • removedInput schema / $defs / ChronicleDiffRequest / properties / action / type
      Removed value: -"string"
    • addedInput schema / $defs / ChronicleDiffRequest / properties / from_revision / anyOf
      Added value: +[
      +  {
      +    "description": "Positive Chronicle revision",
      +    "maximum": 2000000000,
      +    "minimum": 1,
      +    "title": "From Revision",
      +    "type": "integer"
      +  },
      +  {
      +    "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.",
      +    "maxLength": 32,
      +    "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleDiffRequest / properties / from_revision / maximum
      Removed value: -2000000000
    • removedInput schema / $defs / ChronicleDiffRequest / properties / from_revision / minimum
      Removed value: -1
    • removedInput schema / $defs / ChronicleDiffRequest / properties / from_revision / type
      Removed value: -"integer"
    • changedInput schema / $defs / ChronicleDiffRequest / properties / to_revision / anyOf
      Previous value: -[
      -  {
      -    "description": "Positive Chronicle revision",
      -    "maximum": 2000000000,
      -    "minimum": 1,
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Positive Chronicle revision",
      +    "maximum": 2000000000,
      +    "minimum": 1,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  },
      +  {
      +    "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.",
      +    "maxLength": 32,
      +    "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • addedInput schema / $defs / ChronicleIdsSelection / properties / kind / anyOf
      Added value: +[
      +  {
      +    "const": "chronicle_ids",
      +    "title": "Kind",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[cC][hH][rR][oO][nN][iI][cC][lL][eE]_[iI][dD][sS])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleIdsSelection / properties / kind / const
      Removed value: -"chronicle_ids"
    • removedInput schema / $defs / ChronicleIdsSelection / properties / kind / type
      Removed value: -"string"
    • addedInput schema / $defs / ChronicleIdsSelection / properties / values / anyOf
      Added value: +[
      +  {
      +    "items": {
      +      "maxLength": 200,
      +      "minLength": 1,
      +      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]*$",
      +      "type": "string"
      +    },
      +    "maxItems": 5,
      +    "minItems": 2,
      +    "title": "Values",
      +    "type": "array"
      +  },
      +  {
      +    "contentMediaType": "application/json",
      +    "contentSchema": {
      +      "items": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]*$",
      +        "type": "string"
      +      },
      +      "maxItems": 5,
      +      "minItems": 2,
      +      "title": "Values",
      +      "type": "array"
      +    },
      +    "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.",
      +    "maxLength": 1000000,
      +    "type": "string"
      +  },
      +  {
      +    "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.",
      +    "maxLength": 1000000,
      +    "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$",
      +    "type": "string",
      +    "x-pubmed-decodedSchema": {
      +      "items": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]*$",
      +        "type": "string"
      +      },
      +      "maxItems": 5,
      +      "minItems": 2,
      +      "title": "Values",
      +      "type": "array"
      +    },
      +    "x-pubmed-encoding": "fenced-json"
      +  }
      +]
    • removedInput schema / $defs / ChronicleIdsSelection / properties / values / items
      Removed value: -{
      -  "maxLength": 200,
      -  "minLength": 1,
      -  "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]*$",
      -  "type": "string"
      -}
    • removedInput schema / $defs / ChronicleIdsSelection / properties / values / maxItems
      Removed value: -5
    • removedInput schema / $defs / ChronicleIdsSelection / properties / values / minItems
      Removed value: -2
    • removedInput schema / $defs / ChronicleIdsSelection / properties / values / type
      Removed value: -"array"
    • addedInput schema / $defs / ChronicleListRequest / properties / action / anyOf
      Added value: +[
      +  {
      +    "const": "list",
      +    "title": "Action",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[lL][iI][sS][tT])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleListRequest / properties / action / const
      Removed value: -"list"
    • removedInput schema / $defs / ChronicleListRequest / properties / action / type
      Removed value: -"string"
    • addedInput schema / $defs / ChronicleListRequest / properties / limit / anyOf
      Added value: +[
      +  {
      +    "default": 20,
      +    "description": "Maximum Chronicle records",
      +    "maximum": 100,
      +    "minimum": 1,
      +    "title": "Limit",
      +    "type": "integer"
      +  },
      +  {
      +    "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.",
      +    "maxLength": 32,
      +    "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleListRequest / properties / limit / maximum
      Removed value: -100
    • removedInput schema / $defs / ChronicleListRequest / properties / limit / minimum
      Removed value: -1
    • removedInput schema / $defs / ChronicleListRequest / properties / limit / type
      Removed value: -"integer"
    • addedInput schema / $defs / ChronicleLoadRequest / properties / action / anyOf
      Added value: +[
      +  {
      +    "const": "load",
      +    "title": "Action",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[lL][oO][aA][dD])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleLoadRequest / properties / action / const
      Removed value: -"load"
    • removedInput schema / $defs / ChronicleLoadRequest / properties / action / type
      Removed value: -"string"
    • addedInput schema / $defs / ChronicleLoadRequest / properties / output / anyOf
      Added value: +[
      +  {
      +    "default": "summary",
      +    "enum": [
      +      "summary",
      +      "json",
      +      "chronicle_map",
      +      "timeline",
      +      "tree",
      +      "graph",
      +      "evidence",
      +      "milestones",
      +      "mermaid",
      +      "narrative"
      +    ],
      +    "title": "Output",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[sS][uU][mM][mM][aA][rR][yY]|[jJ][sS][oO][nN]|[cC][hH][rR][oO][nN][iI][cC][lL][eE]_[mM][aA][pP]|[tT][iI][mM][eE][lL][iI][nN][eE]|[tT][rR][eE][eE]|[gG][rR][aA][pP][hH]|[eE][vV][iI][dD][eE][nN][cC][eE]|[mM][iI][lL][eE][sS][tT][oO][nN][eE][sS]|[mM][eE][rR][mM][aA][iI][dD]|[nN][aA][rR][rR][aA][tT][iI][vV][eE])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleLoadRequest / properties / output / enum
      Removed value: -[
      -  "summary",
      -  "json",
      -  "chronicle_map",
      -  "timeline",
      -  "tree",
      -  "graph",
      -  "evidence",
      -  "milestones",
      -  "mermaid",
      -  "narrative"
      -]
    • removedInput schema / $defs / ChronicleLoadRequest / properties / output / type
      Removed value: -"string"
    • changedInput schema / $defs / ChronicleLoadRequest / properties / revision / anyOf
      Previous value: -[
      -  {
      -    "description": "Positive Chronicle revision",
      -    "maximum": 2000000000,
      -    "minimum": 1,
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Positive Chronicle revision",
      +    "maximum": 2000000000,
      +    "minimum": 1,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  },
      +  {
      +    "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.",
      +    "maxLength": 32,
      +    "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • addedInput schema / $defs / ChronicleMilestonesRequest / properties / action / anyOf
      Added value: +[
      +  {
      +    "const": "milestones",
      +    "title": "Action",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[mM][iI][lL][eE][sS][tT][oO][nN][eE][sS])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleMilestonesRequest / properties / action / const
      Removed value: -"milestones"
    • removedInput schema / $defs / ChronicleMilestonesRequest / properties / action / type
      Removed value: -"string"
    • changedInput schema / $defs / ChronicleMilestonesRequest / properties / revision / anyOf
      Previous value: -[
      -  {
      -    "description": "Positive Chronicle revision",
      -    "maximum": 2000000000,
      -    "minimum": 1,
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Positive Chronicle revision",
      +    "maximum": 2000000000,
      +    "minimum": 1,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  },
      +  {
      +    "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.",
      +    "maxLength": 32,
      +    "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • addedInput schema / $defs / ChronicleNarrateRequest / properties / action / anyOf
      Added value: +[
      +  {
      +    "const": "narrate",
      +    "title": "Action",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[nN][aA][rR][rR][aA][tT][eE])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleNarrateRequest / properties / action / const
      Removed value: -"narrate"
    • removedInput schema / $defs / ChronicleNarrateRequest / properties / action / type
      Removed value: -"string"
    • addedInput schema / $defs / ChronicleNarrateRequest / properties / mode / anyOf
      Added value: +[
      +  {
      +    "default": "brief",
      +    "enum": [
      +      "brief",
      +      "full"
      +    ],
      +    "title": "Mode",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[bB][rR][iI][eE][fF]|[fF][uU][lL][lL])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleNarrateRequest / properties / mode / enum
      Removed value: -[
      -  "brief",
      -  "full"
      -]
    • removedInput schema / $defs / ChronicleNarrateRequest / properties / mode / type
      Removed value: -"string"
    • changedInput schema / $defs / ChronicleNarrateRequest / properties / revision / anyOf
      Previous value: -[
      -  {
      -    "description": "Positive Chronicle revision",
      -    "maximum": 2000000000,
      -    "minimum": 1,
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Positive Chronicle revision",
      +    "maximum": 2000000000,
      +    "minimum": 1,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  },
      +  {
      +    "description": "ASCII decimal integer; the integer branch's bounds apply after conversion.",
      +    "maxLength": 32,
      +    "pattern": "^[ \\t\\r\\n]*-?(?:0|[1-9][0-9]*)[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • addedInput schema / $defs / ChronicleTopicsSelection / properties / kind / anyOf
      Added value: +[
      +  {
      +    "const": "topics",
      +    "title": "Kind",
      +    "type": "string"
      +  },
      +  {
      +    "pattern": "^[ \\t\\r\\n]*(?:[tT][oO][pP][iI][cC][sS])[ \\t\\r\\n]*$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / $defs / ChronicleTopicsSelection / properties / kind / const
      Removed value: -"topics"
    • removedInput schema / $defs / ChronicleTopicsSelection / properties / kind / type
      Removed value: -"string"
    • addedInput schema / $defs / ChronicleTopicsSelection / properties / values / anyOf
      Added value: +[
      +  {
      +    "items": {
      +      "maxLength": 500,
      +      "minLength": 1,
      +      "pattern": ".*\\S.*",
      +      "type": "string"
      +    },
      +    "maxItems": 5,
      +    "minItems": 2,
      +    "title": "Values",
      +    "type": "array"
      +  },
      +  {
      +    "contentMediaType": "application/json",
      +    "contentSchema": {
      +      "items": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "pattern": ".*\\S.*",
      +        "type": "string"
      +      },
      +      "maxItems": 5,
      +      "minItems": 2,
      +      "title": "Values",
      +      "type": "array"
      +    },
      +    "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.",
      +    "maxLength": 1000000,
      +    "type": "string"
      +  },
      +  {
      +    "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.",
      +    "maxLength": 1000000,
      +    "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$",
      +    "type": "string",
      +    "x-pubmed-decodedSchema": {
      +      "items": {
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "pattern": ".*\\S.*",
      +        "type": "string"
      +      },
      +      "maxItems": 5,
      +      "minItems": 2,
      +      "title": "Values",
      +      "type": "array"
      +    },
      +    "x-pubmed-encoding": "fenced-json"
      +  }
      +]
    • removedInput schema / $defs / ChronicleTopicsSelection / properties / values / items
      Removed value: -{
      -  "maxLength": 500,
      -  "minLength": 1,
      -  "pattern": ".*\\S.*",
      -  "type": "string"
      -}
    • removedInput schema / $defs / ChronicleTopicsSelection / properties / values / maxItems
      Removed value: -5
    • removedInput schema / $defs / ChronicleTopicsSelection / properties / values / minItems
      Removed value: -2
    • removedInput schema / $defs / ChronicleTopicsSelection / properties / values / type
      Removed value: -"array"
    • addedInput schema / properties / request / anyOf
      Added value: +[
      +  {
      +    "discriminator": {
      +      "mapping": {
      +        "compare": "#/$defs/ChronicleCompareRequest",
      +        "diff": "#/$defs/ChronicleDiffRequest",
      +        "list": "#/$defs/ChronicleListRequest",
      +        "load": "#/$defs/ChronicleLoadRequest",
      +        "milestones": "#/$defs/ChronicleMilestonesRequest",
      +        "narrate": "#/$defs/ChronicleNarrateRequest"
      +      },
      +      "propertyName": "action"
      +    },
      +    "oneOf": [
      +      {
      +        "$ref": "#/$defs/ChronicleLoadRequest"
      +      },
      +      {
      +        "$ref": "#/$defs/ChronicleListRequest"
      +      },
      +      {
      +        "$ref": "#/$defs/ChronicleDiffRequest"
      +      },
      +      {
      +        "$ref": "#/$defs/ChronicleNarrateRequest"
      +      },
      +      {
      +        "$ref": "#/$defs/ChronicleMilestonesRequest"
      +      },
      +      {
      +        "$ref": "#/$defs/ChronicleCompareRequest"
      +      }
      +    ],
      +    "title": "Request"
      +  },
      +  {
      +    "contentMediaType": "application/json",
      +    "contentSchema": {
      +      "discriminator": {
      +        "mapping": {
      +          "compare": "#/$defs/ChronicleCompareRequest",
      +          "diff": "#/$defs/ChronicleDiffRequest",
      +          "list": "#/$defs/ChronicleListRequest",
      +          "load": "#/$defs/ChronicleLoadRequest",
      +          "milestones": "#/$defs/ChronicleMilestonesRequest",
      +          "narrate": "#/$defs/ChronicleNarrateRequest"
      +        },
      +        "propertyName": "action"
      +      },
      +      "oneOf": [
      +        {
      +          "$ref": "#/$defs/ChronicleLoadRequest"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleListRequest"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleDiffRequest"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleNarrateRequest"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleMilestonesRequest"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleCompareRequest"
      +        }
      +      ],
      +      "title": "Request"
      +    },
      +    "description": "One JSON-encoded container; the decoded value must satisfy contentSchema.",
      +    "maxLength": 1000000,
      +    "type": "string"
      +  },
      +  {
      +    "description": "One JSON code fence; after removing the fence, decode JSON and validate against x-pubmed-decodedSchema.",
      +    "maxLength": 1000000,
      +    "pattern": "^\\s*```(?:[jJ][sS][oO][nN])?[ \\t]*\\r?\\n[\\s\\S]*\\r?\\n```\\s*$",
      +    "type": "string",
      +    "x-pubmed-decodedSchema": {
      +      "discriminator": {
      +        "mapping": {
      +          "compare": "#/$defs/ChronicleCompareRequest",
      +          "diff": "#/$defs/ChronicleDiffRequest",
      +          "list": "#/$defs/ChronicleListRequest",
      +          "load": "#/$defs/ChronicleLoadRequest",
      +          "milestones": "#/$defs/ChronicleMilestonesRequest",
      +          "narrate": "#/$defs/ChronicleNarrateRequest"
      +        },
      +        "propertyName": "action"
      +      },
      +      "oneOf": [
      +        {
      +          "$ref": "#/$defs/ChronicleLoadRequest"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleListRequest"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleDiffRequest"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleNarrateRequest"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleMilestonesRequest"
      +        },
      +        {
      +          "$ref": "#/$defs/ChronicleCompareRequest"
      +        }
      +      ],
      +      "title": "Request"
      +    },
      +    "x-pubmed-encoding": "fenced-json"
      +  }
      +]
    • removedInput schema / properties / request / discriminator
      Removed value: -{
      -  "mapping": {
      -    "compare": "#/$defs/ChronicleCompareRequest",
      -    "diff": "#/$defs/ChronicleDiffRequest",
      -    "list": "#/$defs/ChronicleListRequest",
      -    "load": "#/$defs/ChronicleLoadRequest",
      -    "milestones": "#/$defs/ChronicleMilestonesRequest",
      -    "narrate": "#/$defs/ChronicleNarrateRequest"
      -  },
      -  "propertyName": "action"
      -}
    • removedInput schema / properties / request / oneOf
      Removed value: -[
      -  {
      -    "$ref": "#/$defs/ChronicleLoadRequest"
      -  },
      -  {
      -    "$ref": "#/$defs/ChronicleListRequest"
      -  },
      -  {
      -    "$ref": "#/$defs/ChronicleDiffRequest"
      -  },
      -  {
      -    "$ref": "#/$defs/ChronicleNarrateRequest"
      -  },
      -  {
      -    "$ref": "#/$defs/ChronicleMilestonesRequest"
      -  },
      -  {
      -    "$ref": "#/$defs/ChronicleCompareRequest"
      -  }
      -]
  2. Addedv0.7.2

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, closed-world, so the safety profile is covered. The description adds genuine context beyond that: chronicles persist across sessions, analysis/comparison are instant and re-run no search, and the diff caveat 'Absence does not prove retirement' warns against over-reading removal results. It omits any pagination or sizing detail for large chronicles.

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-loaded with purpose, then a scannable per-action list, then interface notes and examples — well organized and mostly waste-free. Minor deduction: the lead sentence advertises an 'analyze' action that does not exist in the discriminator (the real actions are load/list/diff/narrate/milestones/compare), a small internal inconsistency in an otherwise tight layout.

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?

For a six-action, heavily nested discriminated-union tool with no output schema, the description covers every action, the selection shape, the return medium ('Markdown or JSON text depending on the action and output format'), and provides a call example per action. Nothing essential to invoking it correctly is missing.

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

Parameters4/5

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

Schema description coverage is effectively 0% at the wrapper level (only fragments like 'Positive Chronicle revision' exist), so the description must compensate. It explains that the `request` discriminator makes invalid field combinations unrepresentable, that `compare` takes a typed `selection` of either 2-5 topics or 2-5 Chronicle IDs, and it points at output formats and narrate modes — meaningful semantics the schema alone does not spell out.

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?

The opening line names a specific verb (read) and resource (stored Research Chronicles) and enumerates the six actions, then names the sibling that creates them (`build_research_chronicle`). An agent can distinguish this read facade from the build tool and from the other read tools without opening the schema.

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

Usage Guidelines4/5

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

Each action is paired with a condition that selects it (load = one revision, list = stored chronicles, diff = compare two revisions, compare = 2-5 chronicles side by side), and the text routes creation to `build_research_chronicle`. It stops short of explicit 'use X instead of Y' exclusions or prerequisites, but the per-action framing gives clear context.

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