Skip to main content
Glama

Read and journal the Timeline

timeline

The project's Timeline: automatic events captured on graph writes and task lifecycle actions, plus one-line custom entries. action = list (read it, newest first, keyset-paginated — not offset-based) | log (append a one-line custom entry). A logged entry is a short journal line, never reasoning or decisions — link the graph nodes that hold those instead. Logging can be turned off for a project; when it is, the call still succeeds but writes nothing.

Input Schema

NameRequiredDescriptionDefault

No arguments

Output Schema

NameRequiredDescriptionDefault
dataYesThe action-specific result returned by Stele.
actionYesThe action that produced this result.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"list\": List the project's Timeline: automatic events captured on graph writes and task lifecycle actions, interleaved with one-line custom entries logged by agents and automations, newest first. Filters (AND-combined): verbs, action type, actor user/agent, capture source, status, component, node (matches the entry's subject or a linked node), and a time range. A custom entry's linked nodes resolve to compact references (id, type, title, status) — never raw uuids. Keyset-paginated, not offset-based: pass a previous page's `next_before` back as `before` to fetch the next (older) page.",
      -    "properties": {
      -      "action": {
      -        "const": "list",
      -        "type": "string"
      -      },
      -      "agent": {
      -        "description": "Filter to entries attributed to this agent name.",
      -        "type": "string"
      -      },
      -      "before": {
      -        "description": "Cursor from a previous page's `next_before` — fetch the next (older) page. Omit for the first (newest) page. Not offset-based: pass the value back unmodified.",
      -        "type": "string"
      -      },
      -      "component_id": {
      -        "description": "Limit to entries about a node under this component.",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "ISO timestamp — only entries at or after this time.",
      -        "type": "string"
      -      },
      -      "limit": {
      -        "description": "Page size (default 50, max 100).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "integer"
      -      },
      -      "node_id": {
      -        "description": "Limit to entries whose subject is this node, OR that link to it.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "query": {
      -        "description": "Substring scan over the entry text and the subject node's title — not ranked search. For a broad relevance-ranked pull use `search` or `recall` instead.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "Filter to one capture surface, e.g. \"mcp\", \"cli\", \"web\".",
      -        "type": "string"
      -      },
      -      "status": {
      -        "description": "Filter to custom entries with this outcome. Has no effect on automatic events.",
      -        "enum": [
      -          "completed",
      -          "partial",
      -          "failed",
      -          "blocked"
      -        ],
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "ISO timestamp — only entries before this time.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "description": "Filter to custom entries with this exact action type (e.g. \"operator.run\"). Has no effect on automatic events, which carry no action type.",
      -        "type": "string"
      -      },
      -      "user": {
      -        "description": "Filter to entries attributed to this user (uuid, not a shareable id).",
      -        "format": "uuid",
      -        "type": "string"
      -      },
      -      "verbs": {
      -        "description": "Filter to these event verbs. Omit for every verb, automatic and custom interleaved.",
      -        "items": {
      -          "enum": [
      -            "created",
      -            "updated",
      -            "status_changed",
      -            "superseded",
      -            "commented",
      -            "claimed",
      -            "released",
      -            "custom",
      -            "linked",
      -            "unlinked"
      -          ],
      -          "type": "string"
      -        },
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"log\": Append a one-line entry to the project's Timeline — for an agent or automation to journal a milestone, with links to the graph items holding the substance. `message` is a short, human-readable line: one thing that happened, never the reasoning behind it or the decision it produced — put those in a knowledge or task node and reference them with `link` instead. `type` is a free-form, caller-namespaced label so entries from different automations don't collide. The Timeline is append-only: a correction is a new entry, not an edit. This capability can be turned off for a project; when it is, the call succeeds but writes nothing, and the response says so.",
      -    "properties": {
      -      "action": {
      -        "const": "log",
      -        "type": "string"
      -      },
      -      "link": {
      -        "description": "Up to 20 nodes this entry is about — the graph items holding the substance.",
      -        "items": {
      -          "description": "Limit to entries about a node under this component.",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "message": {
      -        "description": "REQUIRED — one short line describing what happened. Timeline entries are a journal, not a place for reasoning, decisions, or knowledge — write those as graph nodes instead and reference them with `link`.",
      -        "maxLength": 500,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "privacy_bypass": {
      -        "description": "true writes despite a privacy flag. Only meaningful after a flag; the user decides whether the content can be written.",
      -        "type": "boolean"
      -      },
      -      "privacy_false_positive": {
      -        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      -        "type": "boolean"
      -      },
      -      "privacy_judgement_id": {
      -        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      -        "type": "string"
      -      },
      -      "privacy_note": {
      -        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "status": {
      -        "description": "Outcome of the journaled action. Omit unless you have one to report.",
      -        "enum": [
      -          "completed",
      -          "partial",
      -          "failed",
      -          "blocked"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "description": "REQUIRED — caller-namespaced action type, e.g. \"operator.run\". Free-form; namespace it so entries from different automations don't collide.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "type",
      -      "message"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "timeline action \"list\".",
      +    "properties": {
      +      "action": {
      +        "const": "list",
      +        "description": "Run the list action.",
      +        "type": "string"
      +      },
      +      "agent": {
      +        "description": "Filter to entries attributed to this agent name.",
      +        "type": "string"
      +      },
      +      "before": {
      +        "description": "Cursor from a previous page's `next_before` — fetch the next (older) page. Omit for the first (newest) page. Not offset-based: pass the value back unmodified.",
      +        "type": "string"
      +      },
      +      "component_id": {
      +        "description": "Limit to entries about a node under this component.",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "ISO timestamp — only entries at or after this time.",
      +        "type": "string"
      +      },
      +      "limit": {
      +        "description": "Page size (default 50, max 100).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "integer"
      +      },
      +      "node_id": {
      +        "description": "Limit to entries whose subject is this node, OR that link to it.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query": {
      +        "description": "Substring scan over the entry text and the subject node's title — not ranked search. For a broad relevance-ranked pull use `search` or `recall` instead.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Filter to one capture surface, e.g. \"mcp\", \"cli\", \"web\".",
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Filter to custom entries with this outcome. Has no effect on automatic events.",
      +        "enum": [
      +          "completed",
      +          "partial",
      +          "failed",
      +          "blocked"
      +        ],
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "ISO timestamp — only entries before this time.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "Filter to custom entries with this exact action type (e.g. \"operator.run\"). Has no effect on automatic events, which carry no action type.",
      +        "type": "string"
      +      },
      +      "user": {
      +        "description": "Filter to entries attributed to this user (uuid, not a shareable id).",
      +        "format": "uuid",
      +        "type": "string"
      +      },
      +      "verbs": {
      +        "description": "Filter to these event verbs. Omit for every verb, automatic and custom interleaved.",
      +        "items": {
      +          "enum": [
      +            "created",
      +            "updated",
      +            "status_changed",
      +            "superseded",
      +            "commented",
      +            "claimed",
      +            "released",
      +            "custom",
      +            "linked",
      +            "unlinked"
      +          ],
      +          "type": "string"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "timeline action \"log\".",
      +    "properties": {
      +      "action": {
      +        "const": "log",
      +        "description": "Run the log action.",
      +        "type": "string"
      +      },
      +      "link": {
      +        "description": "Up to 20 nodes this entry is about — the graph items holding the substance.",
      +        "items": {
      +          "description": "Limit to entries about a node under this component.",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "message": {
      +        "description": "REQUIRED — one short line describing what happened. Timeline entries are a journal, not a place for reasoning, decisions, or knowledge — write those as graph nodes instead and reference them with `link`.",
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "privacy_bypass": {
      +        "description": "true writes despite a privacy flag. Only meaningful after a flag; the user decides whether the content can be written.",
      +        "type": "boolean"
      +      },
      +      "privacy_false_positive": {
      +        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      +        "type": "boolean"
      +      },
      +      "privacy_judgement_id": {
      +        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      +        "type": "string"
      +      },
      +      "privacy_note": {
      +        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Outcome of the journaled action. Omit unless you have one to report.",
      +        "enum": [
      +          "completed",
      +          "partial",
      +          "failed",
      +          "blocked"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "REQUIRED — caller-namespaced action type, e.g. \"operator.run\". Free-form; namespace it so entries from different automations don't collide.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "type",
      +      "message"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"list\": List the project's Timeline: automatic events captured on graph writes and task lifecycle actions, interleaved with one-line custom entries logged by agents and automations, newest first. Filters (AND-combined): verbs, action type, actor user/agent, capture source, status, component, node (matches the entry's subject or a linked node), and a time range. A custom entry's linked nodes resolve to compact references (id, type, title, status) — never raw uuids. Keyset-paginated, not offset-based: pass a previous page's `next_before` back as `before` to fetch the next (older) page.",
      -    "properties": {
      -      "action": {
      -        "const": "list",
      -        "type": "string"
      -      },
      -      "agent": {
      -        "description": "Filter to entries attributed to this agent name.",
      -        "type": "string"
      -      },
      -      "before": {
      -        "description": "Cursor from a previous page's `next_before` — fetch the next (older) page. Omit for the first (newest) page. Not offset-based: pass the value back unmodified.",
      -        "type": "string"
      -      },
      -      "component_id": {
      -        "description": "Limit to entries about a node under this component.",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "ISO timestamp — only entries at or after this time.",
      -        "type": "string"
      -      },
      -      "limit": {
      -        "description": "Page size (default 50, max 100).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "integer"
      -      },
      -      "node_id": {
      -        "description": "Limit to entries whose subject is this node, OR that link to it.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "query": {
      -        "description": "Substring scan over the entry text and the subject node's title — not ranked search. For a broad relevance-ranked pull use `search` or `recall` instead.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "Filter to one capture surface, e.g. \"mcp\", \"cli\", \"web\".",
      -        "type": "string"
      -      },
      -      "status": {
      -        "description": "Filter to custom entries with this outcome. Has no effect on automatic events.",
      -        "enum": [
      -          "completed",
      -          "partial",
      -          "failed",
      -          "blocked"
      -        ],
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "ISO timestamp — only entries before this time.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "description": "Filter to custom entries with this exact action type (e.g. \"operator.run\"). Has no effect on automatic events, which carry no action type.",
      -        "type": "string"
      -      },
      -      "user": {
      -        "description": "Filter to entries attributed to this user (uuid, not a shareable id).",
      -        "format": "uuid",
      -        "type": "string"
      -      },
      -      "verbs": {
      -        "description": "Filter to these event verbs. Omit for every verb, automatic and custom interleaved.",
      -        "items": {
      -          "enum": [
      -            "created",
      -            "updated",
      -            "status_changed",
      -            "superseded",
      -            "commented",
      -            "claimed",
      -            "released",
      -            "custom",
      -            "linked",
      -            "unlinked"
      -          ],
      -          "type": "string"
      -        },
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"log\": Append a one-line entry to the project's Timeline — for an agent or automation to journal a milestone, with links to the graph items holding the substance. `message` is a short, human-readable line: one thing that happened, never the reasoning behind it or the decision it produced — put those in a knowledge or task node and reference them with `link` instead. `type` is a free-form, caller-namespaced label so entries from different automations don't collide. The Timeline is append-only: a correction is a new entry, not an edit. This capability can be turned off for a project; when it is, the call succeeds but writes nothing, and the response says so.",
      -    "properties": {
      -      "action": {
      -        "const": "log",
      -        "type": "string"
      -      },
      -      "link": {
      -        "description": "Up to 20 nodes this entry is about — the graph items holding the substance.",
      -        "items": {
      -          "description": "Limit to entries about a node under this component.",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "message": {
      -        "description": "REQUIRED — one short line describing what happened. Timeline entries are a journal, not a place for reasoning, decisions, or knowledge — write those as graph nodes instead and reference them with `link`.",
      -        "maxLength": 500,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "privacy_bypass": {
      -        "description": "true writes despite a privacy flag on a public project. Only meaningful after a flag; the user decides whether the content can be public.",
      -        "type": "boolean"
      -      },
      -      "privacy_false_positive": {
      -        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      -        "type": "boolean"
      -      },
      -      "privacy_judgement_id": {
      -        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      -        "type": "string"
      -      },
      -      "privacy_note": {
      -        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "status": {
      -        "description": "Outcome of the journaled action. Omit unless you have one to report.",
      -        "enum": [
      -          "completed",
      -          "partial",
      -          "failed",
      -          "blocked"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "description": "REQUIRED — caller-namespaced action type, e.g. \"operator.run\". Free-form; namespace it so entries from different automations don't collide.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "type",
      -      "message"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"list\": List the project's Timeline: automatic events captured on graph writes and task lifecycle actions, interleaved with one-line custom entries logged by agents and automations, newest first. Filters (AND-combined): verbs, action type, actor user/agent, capture source, status, component, node (matches the entry's subject or a linked node), and a time range. A custom entry's linked nodes resolve to compact references (id, type, title, status) — never raw uuids. Keyset-paginated, not offset-based: pass a previous page's `next_before` back as `before` to fetch the next (older) page.",
      +    "properties": {
      +      "action": {
      +        "const": "list",
      +        "type": "string"
      +      },
      +      "agent": {
      +        "description": "Filter to entries attributed to this agent name.",
      +        "type": "string"
      +      },
      +      "before": {
      +        "description": "Cursor from a previous page's `next_before` — fetch the next (older) page. Omit for the first (newest) page. Not offset-based: pass the value back unmodified.",
      +        "type": "string"
      +      },
      +      "component_id": {
      +        "description": "Limit to entries about a node under this component.",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "ISO timestamp — only entries at or after this time.",
      +        "type": "string"
      +      },
      +      "limit": {
      +        "description": "Page size (default 50, max 100).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "integer"
      +      },
      +      "node_id": {
      +        "description": "Limit to entries whose subject is this node, OR that link to it.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query": {
      +        "description": "Substring scan over the entry text and the subject node's title — not ranked search. For a broad relevance-ranked pull use `search` or `recall` instead.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Filter to one capture surface, e.g. \"mcp\", \"cli\", \"web\".",
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Filter to custom entries with this outcome. Has no effect on automatic events.",
      +        "enum": [
      +          "completed",
      +          "partial",
      +          "failed",
      +          "blocked"
      +        ],
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "ISO timestamp — only entries before this time.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "Filter to custom entries with this exact action type (e.g. \"operator.run\"). Has no effect on automatic events, which carry no action type.",
      +        "type": "string"
      +      },
      +      "user": {
      +        "description": "Filter to entries attributed to this user (uuid, not a shareable id).",
      +        "format": "uuid",
      +        "type": "string"
      +      },
      +      "verbs": {
      +        "description": "Filter to these event verbs. Omit for every verb, automatic and custom interleaved.",
      +        "items": {
      +          "enum": [
      +            "created",
      +            "updated",
      +            "status_changed",
      +            "superseded",
      +            "commented",
      +            "claimed",
      +            "released",
      +            "custom",
      +            "linked",
      +            "unlinked"
      +          ],
      +          "type": "string"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"log\": Append a one-line entry to the project's Timeline — for an agent or automation to journal a milestone, with links to the graph items holding the substance. `message` is a short, human-readable line: one thing that happened, never the reasoning behind it or the decision it produced — put those in a knowledge or task node and reference them with `link` instead. `type` is a free-form, caller-namespaced label so entries from different automations don't collide. The Timeline is append-only: a correction is a new entry, not an edit. This capability can be turned off for a project; when it is, the call succeeds but writes nothing, and the response says so.",
      +    "properties": {
      +      "action": {
      +        "const": "log",
      +        "type": "string"
      +      },
      +      "link": {
      +        "description": "Up to 20 nodes this entry is about — the graph items holding the substance.",
      +        "items": {
      +          "description": "Limit to entries about a node under this component.",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "message": {
      +        "description": "REQUIRED — one short line describing what happened. Timeline entries are a journal, not a place for reasoning, decisions, or knowledge — write those as graph nodes instead and reference them with `link`.",
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "privacy_bypass": {
      +        "description": "true writes despite a privacy flag. Only meaningful after a flag; the user decides whether the content can be written.",
      +        "type": "boolean"
      +      },
      +      "privacy_false_positive": {
      +        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      +        "type": "boolean"
      +      },
      +      "privacy_judgement_id": {
      +        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      +        "type": "string"
      +      },
      +      "privacy_note": {
      +        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Outcome of the journaled action. Omit unless you have one to report.",
      +        "enum": [
      +          "completed",
      +          "partial",
      +          "failed",
      +          "blocked"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "REQUIRED — caller-namespaced action type, e.g. \"operator.run\". Free-form; namespace it so entries from different automations don't collide.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "type",
      +      "message"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"list\": List the project's Timeline: automatic events captured on graph writes and task lifecycle actions, interleaved with one-line custom entries logged by agents and automations, newest first. Filters (AND-combined): verbs, action type, actor user/agent, capture source, status, component, node (matches the entry's subject or a linked node), and a time range. A custom entry's linked nodes resolve to compact references (id, type, title, status) — never raw uuids. Keyset-paginated, not offset-based: pass a previous page's `next_before` back as `before` to fetch the next (older) page.",
      -    "properties": {
      -      "action": {
      -        "const": "list",
      -        "type": "string"
      -      },
      -      "agent": {
      -        "description": "Filter to entries attributed to this agent name.",
      -        "type": "string"
      -      },
      -      "before": {
      -        "description": "Cursor from a previous page's `next_before` — fetch the next (older) page. Omit for the first (newest) page. Not offset-based: pass the value back unmodified.",
      -        "type": "string"
      -      },
      -      "component_id": {
      -        "description": "Limit to entries about a node under this component.",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "ISO timestamp — only entries at or after this time.",
      -        "type": "string"
      -      },
      -      "limit": {
      -        "description": "Page size (default 50, max 100).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "integer"
      -      },
      -      "node_id": {
      -        "description": "Limit to entries whose subject is this node, OR that link to it.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "query": {
      -        "description": "Substring scan over the entry text and the subject node's title — not ranked search. For a broad relevance-ranked pull use `search` or `recall` instead.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "Filter to one capture surface, e.g. \"mcp\", \"cli\", \"web\".",
      -        "type": "string"
      -      },
      -      "status": {
      -        "description": "Filter to custom entries with this outcome. Has no effect on automatic events.",
      -        "enum": [
      -          "completed",
      -          "partial",
      -          "failed",
      -          "blocked"
      -        ],
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "ISO timestamp — only entries before this time.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "description": "Filter to custom entries with this exact action type (e.g. \"operator.run\"). Has no effect on automatic events, which carry no action type.",
      -        "type": "string"
      -      },
      -      "user": {
      -        "description": "Filter to entries attributed to this user (uuid, not a shareable id).",
      -        "format": "uuid",
      -        "type": "string"
      -      },
      -      "verbs": {
      -        "description": "Filter to these event verbs. Omit for every verb, automatic and custom interleaved.",
      -        "items": {
      -          "enum": [
      -            "created",
      -            "updated",
      -            "status_changed",
      -            "superseded",
      -            "commented",
      -            "claimed",
      -            "released",
      -            "custom",
      -            "linked",
      -            "unlinked"
      -          ],
      -          "type": "string"
      -        },
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"log\": Append a one-line entry to the project's Timeline — for an agent or automation to journal a milestone, with links to the graph items holding the substance. `message` is a short, human-readable line: one thing that happened, never the reasoning behind it or the decision it produced — put those in a knowledge or task node and reference them with `link` instead. `type` is a free-form, caller-namespaced label so entries from different automations don't collide. The Timeline is append-only: a correction is a new entry, not an edit. This capability can be turned off for a project; when it is, the call succeeds but writes nothing, and the response says so.",
      -    "properties": {
      -      "action": {
      -        "const": "log",
      -        "type": "string"
      -      },
      -      "link": {
      -        "description": "Up to 20 nodes this entry is about — the graph items holding the substance.",
      -        "items": {
      -          "description": "Limit to entries about a node under this component.",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "message": {
      -        "description": "REQUIRED — one short line describing what happened. Timeline entries are a journal, not a place for reasoning, decisions, or knowledge — write those as graph nodes instead and reference them with `link`.",
      -        "maxLength": 500,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "status": {
      -        "description": "Outcome of the journaled action. Omit unless you have one to report.",
      -        "enum": [
      -          "completed",
      -          "partial",
      -          "failed",
      -          "blocked"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "description": "REQUIRED — caller-namespaced action type, e.g. \"operator.run\". Free-form; namespace it so entries from different automations don't collide.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "type",
      -      "message"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"list\": List the project's Timeline: automatic events captured on graph writes and task lifecycle actions, interleaved with one-line custom entries logged by agents and automations, newest first. Filters (AND-combined): verbs, action type, actor user/agent, capture source, status, component, node (matches the entry's subject or a linked node), and a time range. A custom entry's linked nodes resolve to compact references (id, type, title, status) — never raw uuids. Keyset-paginated, not offset-based: pass a previous page's `next_before` back as `before` to fetch the next (older) page.",
      +    "properties": {
      +      "action": {
      +        "const": "list",
      +        "type": "string"
      +      },
      +      "agent": {
      +        "description": "Filter to entries attributed to this agent name.",
      +        "type": "string"
      +      },
      +      "before": {
      +        "description": "Cursor from a previous page's `next_before` — fetch the next (older) page. Omit for the first (newest) page. Not offset-based: pass the value back unmodified.",
      +        "type": "string"
      +      },
      +      "component_id": {
      +        "description": "Limit to entries about a node under this component.",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "ISO timestamp — only entries at or after this time.",
      +        "type": "string"
      +      },
      +      "limit": {
      +        "description": "Page size (default 50, max 100).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "integer"
      +      },
      +      "node_id": {
      +        "description": "Limit to entries whose subject is this node, OR that link to it.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query": {
      +        "description": "Substring scan over the entry text and the subject node's title — not ranked search. For a broad relevance-ranked pull use `search` or `recall` instead.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Filter to one capture surface, e.g. \"mcp\", \"cli\", \"web\".",
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Filter to custom entries with this outcome. Has no effect on automatic events.",
      +        "enum": [
      +          "completed",
      +          "partial",
      +          "failed",
      +          "blocked"
      +        ],
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "ISO timestamp — only entries before this time.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "Filter to custom entries with this exact action type (e.g. \"operator.run\"). Has no effect on automatic events, which carry no action type.",
      +        "type": "string"
      +      },
      +      "user": {
      +        "description": "Filter to entries attributed to this user (uuid, not a shareable id).",
      +        "format": "uuid",
      +        "type": "string"
      +      },
      +      "verbs": {
      +        "description": "Filter to these event verbs. Omit for every verb, automatic and custom interleaved.",
      +        "items": {
      +          "enum": [
      +            "created",
      +            "updated",
      +            "status_changed",
      +            "superseded",
      +            "commented",
      +            "claimed",
      +            "released",
      +            "custom",
      +            "linked",
      +            "unlinked"
      +          ],
      +          "type": "string"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"log\": Append a one-line entry to the project's Timeline — for an agent or automation to journal a milestone, with links to the graph items holding the substance. `message` is a short, human-readable line: one thing that happened, never the reasoning behind it or the decision it produced — put those in a knowledge or task node and reference them with `link` instead. `type` is a free-form, caller-namespaced label so entries from different automations don't collide. The Timeline is append-only: a correction is a new entry, not an edit. This capability can be turned off for a project; when it is, the call succeeds but writes nothing, and the response says so.",
      +    "properties": {
      +      "action": {
      +        "const": "log",
      +        "type": "string"
      +      },
      +      "link": {
      +        "description": "Up to 20 nodes this entry is about — the graph items holding the substance.",
      +        "items": {
      +          "description": "Limit to entries about a node under this component.",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "message": {
      +        "description": "REQUIRED — one short line describing what happened. Timeline entries are a journal, not a place for reasoning, decisions, or knowledge — write those as graph nodes instead and reference them with `link`.",
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "privacy_bypass": {
      +        "description": "true writes despite a privacy flag on a public project. Only meaningful after a flag; the user decides whether the content can be public.",
      +        "type": "boolean"
      +      },
      +      "privacy_false_positive": {
      +        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      +        "type": "boolean"
      +      },
      +      "privacy_judgement_id": {
      +        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      +        "type": "string"
      +      },
      +      "privacy_note": {
      +        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Outcome of the journaled action. Omit unless you have one to report.",
      +        "enum": [
      +          "completed",
      +          "partial",
      +          "failed",
      +          "blocked"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "REQUIRED — caller-namespaced action type, e.g. \"operator.run\". Free-form; namespace it so entries from different automations don't collide.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "type",
      +      "message"
      +    ],
      +    "type": "object"
      +  }
      +]
  4. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "timeline action \"list\".",
      -    "properties": {
      -      "action": {
      -        "const": "list",
      -        "description": "Run the list action.",
      -        "type": "string"
      -      },
      -      "agent": {
      -        "description": "Filter to entries attributed to this agent name.",
      -        "type": "string"
      -      },
      -      "before": {
      -        "description": "Cursor from a previous page's `next_before` — fetch the next (older) page. Omit for the first (newest) page. Not offset-based: pass the value back unmodified.",
      -        "type": "string"
      -      },
      -      "component_id": {
      -        "description": "Limit to entries about a node under this component.",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "ISO timestamp — only entries at or after this time.",
      -        "type": "string"
      -      },
      -      "limit": {
      -        "description": "Page size (default 50, max 100).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "integer"
      -      },
      -      "node_id": {
      -        "description": "Limit to entries whose subject is this node, OR that link to it.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "query": {
      -        "description": "Substring scan over the entry text and the subject node's title — not ranked search. For a broad relevance-ranked pull use `search` or `recall` instead.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "Filter to one capture surface, e.g. \"mcp\", \"cli\", \"web\".",
      -        "type": "string"
      -      },
      -      "status": {
      -        "description": "Filter to custom entries with this outcome. Has no effect on automatic events.",
      -        "enum": [
      -          "completed",
      -          "partial",
      -          "failed",
      -          "blocked"
      -        ],
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "ISO timestamp — only entries before this time.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "description": "Filter to custom entries with this exact action type (e.g. \"operator.run\"). Has no effect on automatic events, which carry no action type.",
      -        "type": "string"
      -      },
      -      "user": {
      -        "description": "Filter to entries attributed to this user (uuid, not a shareable id).",
      -        "format": "uuid",
      -        "type": "string"
      -      },
      -      "verbs": {
      -        "description": "Filter to these event verbs. Omit for every verb, automatic and custom interleaved.",
      -        "items": {
      -          "enum": [
      -            "created",
      -            "updated",
      -            "status_changed",
      -            "superseded",
      -            "commented",
      -            "claimed",
      -            "released",
      -            "custom",
      -            "linked",
      -            "unlinked"
      -          ],
      -          "type": "string"
      -        },
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "timeline action \"log\".",
      -    "properties": {
      -      "action": {
      -        "const": "log",
      -        "description": "Run the log action.",
      -        "type": "string"
      -      },
      -      "link": {
      -        "description": "Up to 20 nodes this entry is about — the graph items holding the substance.",
      -        "items": {
      -          "description": "Limit to entries about a node under this component.",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "message": {
      -        "description": "REQUIRED — one short line describing what happened. Timeline entries are a journal, not a place for reasoning, decisions, or knowledge — write those as graph nodes instead and reference them with `link`.",
      -        "maxLength": 500,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "status": {
      -        "description": "Outcome of the journaled action. Omit unless you have one to report.",
      -        "enum": [
      -          "completed",
      -          "partial",
      -          "failed",
      -          "blocked"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "description": "REQUIRED — caller-namespaced action type, e.g. \"operator.run\". Free-form; namespace it so entries from different automations don't collide.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "type",
      -      "message"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"list\": List the project's Timeline: automatic events captured on graph writes and task lifecycle actions, interleaved with one-line custom entries logged by agents and automations, newest first. Filters (AND-combined): verbs, action type, actor user/agent, capture source, status, component, node (matches the entry's subject or a linked node), and a time range. A custom entry's linked nodes resolve to compact references (id, type, title, status) — never raw uuids. Keyset-paginated, not offset-based: pass a previous page's `next_before` back as `before` to fetch the next (older) page.",
      +    "properties": {
      +      "action": {
      +        "const": "list",
      +        "type": "string"
      +      },
      +      "agent": {
      +        "description": "Filter to entries attributed to this agent name.",
      +        "type": "string"
      +      },
      +      "before": {
      +        "description": "Cursor from a previous page's `next_before` — fetch the next (older) page. Omit for the first (newest) page. Not offset-based: pass the value back unmodified.",
      +        "type": "string"
      +      },
      +      "component_id": {
      +        "description": "Limit to entries about a node under this component.",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "ISO timestamp — only entries at or after this time.",
      +        "type": "string"
      +      },
      +      "limit": {
      +        "description": "Page size (default 50, max 100).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "integer"
      +      },
      +      "node_id": {
      +        "description": "Limit to entries whose subject is this node, OR that link to it.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query": {
      +        "description": "Substring scan over the entry text and the subject node's title — not ranked search. For a broad relevance-ranked pull use `search` or `recall` instead.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Filter to one capture surface, e.g. \"mcp\", \"cli\", \"web\".",
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Filter to custom entries with this outcome. Has no effect on automatic events.",
      +        "enum": [
      +          "completed",
      +          "partial",
      +          "failed",
      +          "blocked"
      +        ],
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "ISO timestamp — only entries before this time.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "Filter to custom entries with this exact action type (e.g. \"operator.run\"). Has no effect on automatic events, which carry no action type.",
      +        "type": "string"
      +      },
      +      "user": {
      +        "description": "Filter to entries attributed to this user (uuid, not a shareable id).",
      +        "format": "uuid",
      +        "type": "string"
      +      },
      +      "verbs": {
      +        "description": "Filter to these event verbs. Omit for every verb, automatic and custom interleaved.",
      +        "items": {
      +          "enum": [
      +            "created",
      +            "updated",
      +            "status_changed",
      +            "superseded",
      +            "commented",
      +            "claimed",
      +            "released",
      +            "custom",
      +            "linked",
      +            "unlinked"
      +          ],
      +          "type": "string"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"log\": Append a one-line entry to the project's Timeline — for an agent or automation to journal a milestone, with links to the graph items holding the substance. `message` is a short, human-readable line: one thing that happened, never the reasoning behind it or the decision it produced — put those in a knowledge or task node and reference them with `link` instead. `type` is a free-form, caller-namespaced label so entries from different automations don't collide. The Timeline is append-only: a correction is a new entry, not an edit. This capability can be turned off for a project; when it is, the call succeeds but writes nothing, and the response says so.",
      +    "properties": {
      +      "action": {
      +        "const": "log",
      +        "type": "string"
      +      },
      +      "link": {
      +        "description": "Up to 20 nodes this entry is about — the graph items holding the substance.",
      +        "items": {
      +          "description": "Limit to entries about a node under this component.",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "message": {
      +        "description": "REQUIRED — one short line describing what happened. Timeline entries are a journal, not a place for reasoning, decisions, or knowledge — write those as graph nodes instead and reference them with `link`.",
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "Outcome of the journaled action. Omit unless you have one to report.",
      +        "enum": [
      +          "completed",
      +          "partial",
      +          "failed",
      +          "blocked"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "REQUIRED — caller-namespaced action type, e.g. \"operator.run\". Free-form; namespace it so entries from different automations don't collide.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "type",
      +      "message"
      +    ],
      +    "type": "object"
      +  }
      +]
  5. First observed

TDQS

A4.4/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, so the write-capable, non-destructive profile is already known. The description still adds genuine behavioral context the annotations cannot: keyset (not offset) pagination, the silent no-op when logging is disabled (call succeeds but writes nothing), and the privacy_bypass flow. Given the annotations carry the safety profile, a 3 is appropriate, though the silent-no-op disclosure pushes toward the upper end.

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 resource and both actions with a compact pipe-separated structure, and every sentence carries information. There is mild duplication of the journal-vs-reasoning guidance between the description and the `message` param, which keeps it just short of 5.

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?

An output schema exists, so return values need not be described. For a two-action tool the description covers the read path (ordering, pagination style), the write path (entry content constraints, silent no-op when disabled), and the privacy bypass flow — nothing an agent needs to invoke 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 100%, so the baseline is 3 and the schema already documents filtering fields. The description adds meaning beyond it by framing pagination as keyset rather than offset and by constraining what a logged `message`/`link` should contain (a journal line, never reasoning), which shapes how the write action's payload should be used.

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?

Names the resource (the project's Timeline) and both operations with specific verbs: `list` reads newest-first keyset-paginated entries, `log` appends a one-line custom journal entry. It also characterizes the content (automatic events from graph writes/task lifecycle plus custom entries), so an agent can distinguish it from siblings like `search` or `recall` 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 Guidelines5/5

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

Explicit when/when-not guidance for both actions: use it to read or journal, but never for reasoning or decisions — link graph nodes instead — and use `search`/`recall` for ranked pulls (echoed in the `query` param). It also warns that logging may be disabled at the project level, which changes what the agent should expect from the call.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.