Skip to main content
Glama

Inspect a node in depth

inspect
Read-only

Look at what surrounds one node or the whole project: its connections, its history, and the project's state. Read-only. Use fetch for a node's own content, search to find nodes by their words, and recall to gather context for a question; use inspect when you need more than the node itself. Actions: context: a scored neighborhood of decisions, risks and tasks connected to a node, query or topic; read it before changing something it touches. provenance: the cited chain of why a node exists and what it superseded; check it before relying on or overriding a decision. briefing: the project's working rules, root components and suggested first calls; call it once at the start of a session. claim_history: who claimed and released a task, and when; check it before force-claiming a task that looks abandoned. workspace: one workspace overlay's details. stats: project totals, overdue commitments, likely-abandoned tasks and recent activity, in one call. loop: verify a task's protected check paths against local Git state; local only, and it fails closed. rag_status: what automatic topic recall is focused on now; local only.

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=\"context\": Walk the project graph from FTS (or topic-tag) seeds and return a scored neighborhood — not just flat search hits. Use BEFORE starting non-trivial work on a topic: it surfaces decisions, blockers, and prior lessons connected via edges that don't themselves contain the search keywords. Unlike search (flat FTS, no traversal), this seeds via FTS then follows edges, scoring by category + relation + recency. Hub nodes contribute only their most-recent edges, so a root component doesn't drag in the whole project. Bodies are truncated to ~400 chars and the total payload is capped at ~30k chars (lowest-scored non-seed nodes dropped, `_truncated: true` set); call fetch with the short id for a full body.",
      -    "properties": {
      -      "action": {
      -        "const": "context",
      -        "type": "string"
      -      },
      -      "depth": {
      -        "description": "(context only) BFS depth from seeds (default 1, max 3). 0 returns just seeds; 1 follows one edge.",
      -        "maximum": 3,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "hub_edge_limit": {
      -        "description": "(context only) Soft limit: nodes with more edges than this contribute only their N most-recent edges (default 12).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 50,
      -        "type": "integer"
      -      },
      -      "max_entries": {
      -        "description": "(context only) Cap on returned nodes (default 30, max 100).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "integer"
      -      },
      -      "node_id": {
      -        "description": "(context/provenance only) Shareable id (TASK-N/KNOW-N/COMP-N/DOC-N) to seed by: the node's title becomes the FTS query, then the walk proceeds from there. Use to expand the neighborhood around a specific node without already knowing good search terms. Overrides `query`.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "query": {
      -        "description": "(context/provenance only) FTS query, in the same syntax as keyword search. Either query or topic must be set.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "seed_limit": {
      -        "description": "(context only) Cap on seed nodes from FTS / topic match (default 10).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 50,
      -        "type": "integer"
      -      },
      -      "topic": {
      -        "description": "(context only) Topic tag to seed by (case-insensitive exact match on the topics array). Skips FTS — use when you want a clean topic-scoped neighborhood.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"provenance\": Walk the graph linearly from a seed and return a single ordered lineage answering 'why is X the way it is?'. At each hop it follows the strongest un-visited edge (fulfills > caused-by/supersedes > contradicts/blocks > mentions/relates-to), stopping at a risk-category node, when edges run out, or at max_hops. Use this when you want a cited chain you can narrate; use inspect(action=\"context\") for a broad unordered neighborhood to reason against. Supply exactly ONE of `node_id` (a shareable id) or `query` (free text resolved to the top FTS hit) — both or neither is a hard error.",
      -    "properties": {
      -      "action": {
      -        "const": "provenance",
      -        "type": "string"
      -      },
      -      "max_hops": {
      -        "description": "(provenance only) Walker depth cap (default 5, max 8). 0 returns just the seed.",
      -        "maximum": 8,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "node_id": {
      -        "description": "Starting node — shareable id (TASK-N | KNOW-N | COMP-N | DOC-N | NODE-N). Exactly one of `node_id` or `query` must be set.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "query": {
      -        "description": "Free-text 'why' prompt — resolved to a starting node via FTS top-1 hit. Exactly one of `node_id` or `query` must be set.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"briefing\": Return a compact, stateless briefing that teaches a visiting agent how to use Stele safely for the current project — for hosted/remote clients (ChatGPT, Claude web, Cursor, Codex, Gemini) that connect via MCP but lack hooks, skills, or automatic recall. The response is a PURE READ: it does NOT set an active project or store any session state, so every subsequent tool still requires project_slug explicitly. Call once at the start of a session or task when nothing is being surfaced to you automatically.",
      -    "properties": {
      -      "action": {
      -        "const": "briefing",
      -        "type": "string"
      -      },
      -      "environment": {
      -        "additionalProperties": false,
      -        "description": "(briefing only) Describes which Stele harness features the calling client has. All fields default to false/unknown when absent — the safest assumption for hosted clients.",
      -        "properties": {
      -          "auto_rag_available": {
      -            "description": "True if this client can point automatic recall at a topic and receive related context on later turns. False/absent → the briefing tells the agent to look things up with recall itself, every time.",
      -            "type": "boolean"
      -          },
      -          "hooks_available": {
      -            "description": "True if the host client runs Stele lifecycle hooks (recall, session_start, etc.). False/absent → the briefing includes manual fallback instructions.",
      -            "type": "boolean"
      -          },
      -          "skills_available": {
      -            "description": "True if the host client can invoke Stele skills (e.g. /stele:start). False/absent → the briefing instructs the agent to follow protocol manually.",
      -            "type": "boolean"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "intent": {
      -        "description": "(briefing only) Short description of the current request or goal (e.g. 'review launch plan', 'fix the auth bug'). When provided, the briefing includes intent-specific next-call suggestions with project_slug already filled in.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"claim_history\": Full append-only claim history for a task — every claim/release/complete/cancel with agent, model, session, worktree, and operator lineage. Capped at 200 events.",
      -    "properties": {
      -      "action": {
      -        "const": "claim_history",
      -        "type": "string"
      -      },
      -      "node_id": {
      -        "description": "(claim_history only) Task shareable id (e.g. TASK-42).",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "node_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"workspace\": Fetch one workspace by NAME or uuid, including its branch associations and whether it's active for this session.",
      -    "properties": {
      -      "action": {
      -        "const": "workspace",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "workspace": {
      -        "description": "(workspace only) The workspace to fetch — its NAME (e.g. \"Billing\") or its uuid. NOT a short-id (workspaces aren't nodes).",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "workspace"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"stats\": One-call overview of the active project — counts, top topics, overdue deadlines (any active knowledge with a past due_at), likely-abandoned tasks (claimed > 24h ago), and recent activity. Cheaper than running list(what=\"components\") + list_tasks + search separately.",
      -    "properties": {
      -      "action": {
      -        "const": "stats",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"loop\": Fail closed unless trusted local Git proves the branch left every declared Check path untouched. Exit 0 certifies oracle integrity, 1 names protected paths the branch modified, and 2 means unknown. Changed files are computed locally; callers cannot supply them.",
      -    "properties": {
      -      "action": {
      -        "const": "loop",
      -        "type": "string"
      -      },
      -      "base": {
      -        "description": "Base git ref (default main).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "branch": {
      -        "description": "Worker branch git ref (default HEAD).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "node_id": {
      -        "description": "Task whose declared Check and Check paths form the loop contract.",
      -        "pattern": "^TASK-\\d+$",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "node_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"rag_status\": Report this session's automatic topic recall: whether a focus is set, what it is, and whether recall is paused. Use it when you are unsure whether the context you are being shown still matches the work — if the focus names last hour's task, replace it.",
      -    "properties": {
      -      "action": {
      -        "const": "rag_status",
      -        "type": "string"
      -      },
      -      "recall_session": {
      -        "description": "The recall session handle Stele printed in this conversation. Without it this reports only that automatic topic recall is unavailable here.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "inspect action \"context\".",
      +    "properties": {
      +      "action": {
      +        "const": "context",
      +        "description": "Run the context action.",
      +        "type": "string"
      +      },
      +      "depth": {
      +        "description": "(context only) BFS depth from seeds (default 1, max 3). 0 returns just seeds; 1 follows one edge.",
      +        "maximum": 3,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "hub_edge_limit": {
      +        "description": "(context only) Soft limit: nodes with more edges than this contribute only their N most-recent edges (default 12).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 50,
      +        "type": "integer"
      +      },
      +      "max_entries": {
      +        "description": "(context only) Cap on returned nodes (default 30, max 100).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "integer"
      +      },
      +      "node_id": {
      +        "description": "(context/provenance only) Shareable id (TASK-N/KNOW-N/COMP-N/DOC-N) to seed by: the node's title becomes the FTS query, then the walk proceeds from there. Use to expand the neighborhood around a specific node without already knowing good search terms. Overrides `query`.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query": {
      +        "description": "(context/provenance only) FTS query, in the same syntax as keyword search. Either query or topic must be set.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "seed_limit": {
      +        "description": "(context only) Cap on seed nodes from FTS / topic match (default 10).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 50,
      +        "type": "integer"
      +      },
      +      "topic": {
      +        "description": "(context only) Topic tag to seed by (case-insensitive exact match on the topics array). Skips FTS — use when you want a clean topic-scoped neighborhood.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "inspect action \"provenance\".",
      +    "properties": {
      +      "action": {
      +        "const": "provenance",
      +        "description": "Run the provenance action.",
      +        "type": "string"
      +      },
      +      "max_hops": {
      +        "description": "(provenance only) Walker depth cap (default 5, max 8). 0 returns just the seed.",
      +        "maximum": 8,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "node_id": {
      +        "description": "Starting node — shareable id (TASK-N | KNOW-N | COMP-N | DOC-N | NODE-N). Exactly one of `node_id` or `query` must be set.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query": {
      +        "description": "Free-text 'why' prompt — resolved to a starting node via FTS top-1 hit. Exactly one of `node_id` or `query` must be set.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "inspect action \"briefing\".",
      +    "properties": {
      +      "action": {
      +        "const": "briefing",
      +        "description": "Run the briefing action.",
      +        "type": "string"
      +      },
      +      "environment": {
      +        "additionalProperties": false,
      +        "description": "(briefing only) Describes which Stele harness features the calling client has. All fields default to false/unknown when absent — the safest assumption for hosted clients.",
      +        "properties": {
      +          "auto_rag_available": {
      +            "description": "True if this client can point automatic recall at a topic and receive related context on later turns. False/absent → the briefing tells the agent to look things up with recall itself, every time.",
      +            "type": "boolean"
      +          },
      +          "hooks_available": {
      +            "description": "True if the host client runs Stele lifecycle hooks (recall, session_start, etc.). False/absent → the briefing includes manual fallback instructions.",
      +            "type": "boolean"
      +          },
      +          "skills_available": {
      +            "description": "True if the host client can invoke Stele skills (e.g. /stele:start). False/absent → the briefing instructs the agent to follow protocol manually.",
      +            "type": "boolean"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "intent": {
      +        "description": "(briefing only) Short description of the current request or goal (e.g. 'review launch plan', 'fix the auth bug'). When provided, the briefing includes intent-specific next-call suggestions with project_slug already filled in.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "inspect action \"claim_history\".",
      +    "properties": {
      +      "action": {
      +        "const": "claim_history",
      +        "description": "Run the claim_history action.",
      +        "type": "string"
      +      },
      +      "node_id": {
      +        "description": "(claim_history only) Task shareable id (e.g. TASK-42).",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "node_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "inspect action \"workspace\".",
      +    "properties": {
      +      "action": {
      +        "const": "workspace",
      +        "description": "Run the workspace action.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "workspace": {
      +        "description": "(workspace only) The workspace to fetch — its NAME (e.g. \"Billing\") or its uuid. NOT a short-id (workspaces aren't nodes).",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "workspace"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "inspect action \"stats\".",
      +    "properties": {
      +      "action": {
      +        "const": "stats",
      +        "description": "Run the stats action.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "inspect action \"loop\".",
      +    "properties": {
      +      "action": {
      +        "const": "loop",
      +        "description": "Run the loop action.",
      +        "type": "string"
      +      },
      +      "base": {
      +        "description": "Base git ref (default main).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "branch": {
      +        "description": "Worker branch git ref (default HEAD).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "node_id": {
      +        "description": "Task whose declared Check and Check paths form the loop contract.",
      +        "pattern": "^TASK-\\d+$",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "node_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "inspect action \"rag_status\".",
      +    "properties": {
      +      "action": {
      +        "const": "rag_status",
      +        "description": "Run the rag_status action.",
      +        "type": "string"
      +      },
      +      "recall_session": {
      +        "description": "The recall session handle Stele printed in this conversation. Without it this reports only that automatic topic recall is unavailable here.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"context\": Walk the project graph from FTS (or topic-tag) seeds and return a scored neighborhood — not just flat search hits. Use BEFORE starting non-trivial work on a topic: it surfaces decisions, blockers, and prior lessons connected via edges that don't themselves contain the search keywords. Unlike search (flat FTS, no traversal), this seeds via FTS then follows edges, scoring by category + relation + recency. Hub nodes contribute only their most-recent edges, so a root component doesn't drag in the whole project. Bodies are truncated to ~400 chars and the total payload is capped at ~30k chars (lowest-scored non-seed nodes dropped, `_truncated: true` set); call fetch with the short id for a full body.",
      -    "properties": {
      -      "action": {
      -        "const": "context",
      -        "type": "string"
      -      },
      -      "depth": {
      -        "description": "(context only) BFS depth from seeds (default 1, max 3). 0 returns just seeds; 1 follows one edge.",
      -        "maximum": 3,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "hub_edge_limit": {
      -        "description": "(context only) Soft limit: nodes with more edges than this contribute only their N most-recent edges (default 12).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 50,
      -        "type": "integer"
      -      },
      -      "max_entries": {
      -        "description": "(context only) Cap on returned nodes (default 30, max 100).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "integer"
      -      },
      -      "node_id": {
      -        "description": "(context/provenance only) Shareable id (TASK-N/KNOW-N/COMP-N/DOC-N) to seed by: the node's title becomes the FTS query, then the walk proceeds from there. Use to expand the neighborhood around a specific node without already knowing good search terms. Overrides `query`.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "query": {
      -        "description": "(context/provenance only) FTS query, in the same syntax as keyword search. Either query or topic must be set.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "seed_limit": {
      -        "description": "(context only) Cap on seed nodes from FTS / topic match (default 10).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 50,
      -        "type": "integer"
      -      },
      -      "topic": {
      -        "description": "(context only) Topic tag to seed by (case-insensitive exact match on the topics array). Skips FTS — use when you want a clean topic-scoped neighborhood.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"provenance\": Walk the graph linearly from a seed and return a single ordered lineage answering 'why is X the way it is?'. At each hop it follows the strongest un-visited edge (fulfills > caused-by/supersedes > contradicts/blocks > mentions/relates-to), stopping at a risk-category node, when edges run out, or at max_hops. Use this when you want a cited chain you can narrate; use inspect(action=\"context\") for a broad unordered neighborhood to reason against. Supply exactly ONE of `node_id` (a shareable id) or `query` (free text resolved to the top FTS hit) — both or neither is a hard error.",
      -    "properties": {
      -      "action": {
      -        "const": "provenance",
      -        "type": "string"
      -      },
      -      "max_hops": {
      -        "description": "(provenance only) Walker depth cap (default 5, max 8). 0 returns just the seed.",
      -        "maximum": 8,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "node_id": {
      -        "description": "Starting node — shareable id (TASK-N | KNOW-N | COMP-N | DOC-N | NODE-N). Exactly one of `node_id` or `query` must be set.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "query": {
      -        "description": "Free-text 'why' prompt — resolved to a starting node via FTS top-1 hit. Exactly one of `node_id` or `query` must be set.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"briefing\": Return a compact, stateless briefing that teaches a visiting agent how to use Stele safely for the current project — for hosted/remote clients (ChatGPT, Claude web, Cursor, Codex, Gemini) that connect via MCP but lack hooks, skills, or automatic recall. The response is a PURE READ: it does NOT set an active project or store any session state, so every subsequent tool still requires project_slug explicitly. Call once at the start of a session or task when nothing is being surfaced to you automatically.",
      -    "properties": {
      -      "action": {
      -        "const": "briefing",
      -        "type": "string"
      -      },
      -      "environment": {
      -        "additionalProperties": false,
      -        "description": "(briefing only) Describes which Stele harness features the calling client has. All fields default to false/unknown when absent — the safest assumption for hosted clients.",
      -        "properties": {
      -          "auto_rag_available": {
      -            "description": "True if this client can point automatic recall at a topic and receive related context on later turns. False/absent → the briefing tells the agent to look things up with recall itself, every time.",
      -            "type": "boolean"
      -          },
      -          "hooks_available": {
      -            "description": "True if the host client runs Stele lifecycle hooks (recall, session_start, etc.). False/absent → the briefing includes manual fallback instructions.",
      -            "type": "boolean"
      -          },
      -          "skills_available": {
      -            "description": "True if the host client can invoke Stele skills (e.g. /stele:start). False/absent → the briefing instructs the agent to follow protocol manually.",
      -            "type": "boolean"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "intent": {
      -        "description": "(briefing only) Short description of the current request or goal (e.g. 'review launch plan', 'fix the auth bug'). When provided, the briefing includes intent-specific next-call suggestions with project_slug already filled in.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"claim_history\": Full append-only claim history for a task — every claim/release/complete/cancel with agent, model, session, worktree, and operator lineage. Capped at 200 events.",
      -    "properties": {
      -      "action": {
      -        "const": "claim_history",
      -        "type": "string"
      -      },
      -      "node_id": {
      -        "description": "(claim_history only) Task shareable id (e.g. TASK-42).",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "node_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"workspace\": Fetch one workspace by NAME or uuid, including its branch associations and whether it's active for this session.",
      -    "properties": {
      -      "action": {
      -        "const": "workspace",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "workspace": {
      -        "description": "(workspace only) The workspace to fetch — its NAME (e.g. \"Billing\") or its uuid. NOT a short-id (workspaces aren't nodes).",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "workspace"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"stats\": One-call overview of the active project — counts, top topics, overdue deadlines (any active knowledge with a past due_at), likely-abandoned tasks (claimed > 24h ago), and recent activity. Cheaper than running list(what=\"components\") + list_tasks + search separately.",
      -    "properties": {
      -      "action": {
      -        "const": "stats",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"loop\": Fail closed unless trusted local Git proves the branch left every declared Check path untouched. Exit 0 certifies oracle integrity, 1 names protected paths the branch modified, and 2 means unknown. Changed files are computed locally; callers cannot supply them.",
      -    "properties": {
      -      "action": {
      -        "const": "loop",
      -        "type": "string"
      -      },
      -      "base": {
      -        "description": "Base git ref (default main).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "branch": {
      -        "description": "Worker branch git ref (default HEAD).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "node_id": {
      -        "description": "Task whose declared Check and Check paths form the loop contract.",
      -        "pattern": "^TASK-\\d+$",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "node_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"rag_status\": Report this session's automatic topic recall: whether a focus is set, what it is, and whether recall is paused. Use it when you are unsure whether the context you are being shown still matches the work — if the focus names last hour's task, replace it.",
      -    "properties": {
      -      "action": {
      -        "const": "rag_status",
      -        "type": "string"
      -      },
      -      "recall_session": {
      -        "description": "The recall session handle from the awaiting-focus notice. Without it this reports only that automatic topic recall is unavailable here.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"context\": Walk the project graph from FTS (or topic-tag) seeds and return a scored neighborhood — not just flat search hits. Use BEFORE starting non-trivial work on a topic: it surfaces decisions, blockers, and prior lessons connected via edges that don't themselves contain the search keywords. Unlike search (flat FTS, no traversal), this seeds via FTS then follows edges, scoring by category + relation + recency. Hub nodes contribute only their most-recent edges, so a root component doesn't drag in the whole project. Bodies are truncated to ~400 chars and the total payload is capped at ~30k chars (lowest-scored non-seed nodes dropped, `_truncated: true` set); call fetch with the short id for a full body.",
      +    "properties": {
      +      "action": {
      +        "const": "context",
      +        "type": "string"
      +      },
      +      "depth": {
      +        "description": "(context only) BFS depth from seeds (default 1, max 3). 0 returns just seeds; 1 follows one edge.",
      +        "maximum": 3,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "hub_edge_limit": {
      +        "description": "(context only) Soft limit: nodes with more edges than this contribute only their N most-recent edges (default 12).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 50,
      +        "type": "integer"
      +      },
      +      "max_entries": {
      +        "description": "(context only) Cap on returned nodes (default 30, max 100).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "integer"
      +      },
      +      "node_id": {
      +        "description": "(context/provenance only) Shareable id (TASK-N/KNOW-N/COMP-N/DOC-N) to seed by: the node's title becomes the FTS query, then the walk proceeds from there. Use to expand the neighborhood around a specific node without already knowing good search terms. Overrides `query`.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query": {
      +        "description": "(context/provenance only) FTS query, in the same syntax as keyword search. Either query or topic must be set.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "seed_limit": {
      +        "description": "(context only) Cap on seed nodes from FTS / topic match (default 10).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 50,
      +        "type": "integer"
      +      },
      +      "topic": {
      +        "description": "(context only) Topic tag to seed by (case-insensitive exact match on the topics array). Skips FTS — use when you want a clean topic-scoped neighborhood.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"provenance\": Walk the graph linearly from a seed and return a single ordered lineage answering 'why is X the way it is?'. At each hop it follows the strongest un-visited edge (fulfills > caused-by/supersedes > contradicts/blocks > mentions/relates-to), stopping at a risk-category node, when edges run out, or at max_hops. Use this when you want a cited chain you can narrate; use inspect(action=\"context\") for a broad unordered neighborhood to reason against. Supply exactly ONE of `node_id` (a shareable id) or `query` (free text resolved to the top FTS hit) — both or neither is a hard error.",
      +    "properties": {
      +      "action": {
      +        "const": "provenance",
      +        "type": "string"
      +      },
      +      "max_hops": {
      +        "description": "(provenance only) Walker depth cap (default 5, max 8). 0 returns just the seed.",
      +        "maximum": 8,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "node_id": {
      +        "description": "Starting node — shareable id (TASK-N | KNOW-N | COMP-N | DOC-N | NODE-N). Exactly one of `node_id` or `query` must be set.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query": {
      +        "description": "Free-text 'why' prompt — resolved to a starting node via FTS top-1 hit. Exactly one of `node_id` or `query` must be set.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"briefing\": Return a compact, stateless briefing that teaches a visiting agent how to use Stele safely for the current project — for hosted/remote clients (ChatGPT, Claude web, Cursor, Codex, Gemini) that connect via MCP but lack hooks, skills, or automatic recall. The response is a PURE READ: it does NOT set an active project or store any session state, so every subsequent tool still requires project_slug explicitly. Call once at the start of a session or task when nothing is being surfaced to you automatically.",
      +    "properties": {
      +      "action": {
      +        "const": "briefing",
      +        "type": "string"
      +      },
      +      "environment": {
      +        "additionalProperties": false,
      +        "description": "(briefing only) Describes which Stele harness features the calling client has. All fields default to false/unknown when absent — the safest assumption for hosted clients.",
      +        "properties": {
      +          "auto_rag_available": {
      +            "description": "True if this client can point automatic recall at a topic and receive related context on later turns. False/absent → the briefing tells the agent to look things up with recall itself, every time.",
      +            "type": "boolean"
      +          },
      +          "hooks_available": {
      +            "description": "True if the host client runs Stele lifecycle hooks (recall, session_start, etc.). False/absent → the briefing includes manual fallback instructions.",
      +            "type": "boolean"
      +          },
      +          "skills_available": {
      +            "description": "True if the host client can invoke Stele skills (e.g. /stele:start). False/absent → the briefing instructs the agent to follow protocol manually.",
      +            "type": "boolean"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "intent": {
      +        "description": "(briefing only) Short description of the current request or goal (e.g. 'review launch plan', 'fix the auth bug'). When provided, the briefing includes intent-specific next-call suggestions with project_slug already filled in.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"claim_history\": Full append-only claim history for a task — every claim/release/complete/cancel with agent, model, session, worktree, and operator lineage. Capped at 200 events.",
      +    "properties": {
      +      "action": {
      +        "const": "claim_history",
      +        "type": "string"
      +      },
      +      "node_id": {
      +        "description": "(claim_history only) Task shareable id (e.g. TASK-42).",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "node_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"workspace\": Fetch one workspace by NAME or uuid, including its branch associations and whether it's active for this session.",
      +    "properties": {
      +      "action": {
      +        "const": "workspace",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "workspace": {
      +        "description": "(workspace only) The workspace to fetch — its NAME (e.g. \"Billing\") or its uuid. NOT a short-id (workspaces aren't nodes).",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "workspace"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"stats\": One-call overview of the active project — counts, top topics, overdue deadlines (any active knowledge with a past due_at), likely-abandoned tasks (claimed > 24h ago), and recent activity. Cheaper than running list(what=\"components\") + list_tasks + search separately.",
      +    "properties": {
      +      "action": {
      +        "const": "stats",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"loop\": Fail closed unless trusted local Git proves the branch left every declared Check path untouched. Exit 0 certifies oracle integrity, 1 names protected paths the branch modified, and 2 means unknown. Changed files are computed locally; callers cannot supply them.",
      +    "properties": {
      +      "action": {
      +        "const": "loop",
      +        "type": "string"
      +      },
      +      "base": {
      +        "description": "Base git ref (default main).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "branch": {
      +        "description": "Worker branch git ref (default HEAD).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "node_id": {
      +        "description": "Task whose declared Check and Check paths form the loop contract.",
      +        "pattern": "^TASK-\\d+$",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "node_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"rag_status\": Report this session's automatic topic recall: whether a focus is set, what it is, and whether recall is paused. Use it when you are unsure whether the context you are being shown still matches the work — if the focus names last hour's task, replace it.",
      +    "properties": {
      +      "action": {
      +        "const": "rag_status",
      +        "type": "string"
      +      },
      +      "recall_session": {
      +        "description": "The recall session handle Stele printed in this conversation. Without it this reports only that automatic topic recall is unavailable here.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "inspect action \"context\".",
      -    "properties": {
      -      "action": {
      -        "const": "context",
      -        "description": "Run the context action.",
      -        "type": "string"
      -      },
      -      "depth": {
      -        "description": "(context only) BFS depth from seeds (default 1, max 3). 0 returns just seeds; 1 follows one edge.",
      -        "maximum": 3,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "hub_edge_limit": {
      -        "description": "(context only) Soft limit: nodes with more edges than this contribute only their N most-recent edges (default 12).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 50,
      -        "type": "integer"
      -      },
      -      "max_entries": {
      -        "description": "(context only) Cap on returned nodes (default 30, max 100).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 100,
      -        "type": "integer"
      -      },
      -      "node_id": {
      -        "description": "(context/provenance only) Shareable id (TASK-N/KNOW-N/COMP-N/DOC-N) to seed by: the node's title becomes the FTS query, then the walk proceeds from there. Use to expand the neighborhood around a specific node without already knowing good search terms. Overrides `query`.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "query": {
      -        "description": "(context/provenance only) FTS query. Same syntax as search_nodes. Either query or topic must be set.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "seed_limit": {
      -        "description": "(context only) Cap on seed nodes from FTS / topic match (default 10).",
      -        "exclusiveMinimum": 0,
      -        "maximum": 50,
      -        "type": "integer"
      -      },
      -      "topic": {
      -        "description": "(context only) Topic tag to seed by (case-insensitive exact match on the topics array). Skips FTS — use when you want a clean topic-scoped neighborhood.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "inspect action \"provenance\".",
      -    "properties": {
      -      "action": {
      -        "const": "provenance",
      -        "description": "Run the provenance action.",
      -        "type": "string"
      -      },
      -      "max_hops": {
      -        "description": "(provenance only) Walker depth cap (default 5, max 8). 0 returns just the seed.",
      -        "maximum": 8,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "node_id": {
      -        "description": "Starting node — shareable id (TASK-N | KNOW-N | COMP-N | DOC-N | NODE-N). Exactly one of `node_id` or `query` must be set.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "query": {
      -        "description": "Free-text 'why' prompt — resolved to a starting node via FTS top-1 hit. Exactly one of `node_id` or `query` must be set.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "inspect action \"briefing\".",
      -    "properties": {
      -      "action": {
      -        "const": "briefing",
      -        "description": "Run the briefing action.",
      -        "type": "string"
      -      },
      -      "environment": {
      -        "additionalProperties": false,
      -        "description": "(briefing only) Describes which Stele harness features the calling client has. All fields default to false/unknown when absent — the safest assumption for hosted clients.",
      -        "properties": {
      -          "auto_rag_available": {
      -            "description": "True if this client can point automatic recall at a topic and receive related context on later turns. False/absent → the briefing tells the agent to look things up with recall itself, every time.",
      -            "type": "boolean"
      -          },
      -          "hooks_available": {
      -            "description": "True if the host client runs Stele lifecycle hooks (recall, session_start, etc.). False/absent → the briefing includes manual fallback instructions.",
      -            "type": "boolean"
      -          },
      -          "skills_available": {
      -            "description": "True if the host client can invoke Stele skills (e.g. /stele:start). False/absent → the briefing instructs the agent to follow protocol manually.",
      -            "type": "boolean"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "intent": {
      -        "description": "(briefing only) Short description of the current request or goal (e.g. 'review launch plan', 'fix the auth bug'). When provided, the briefing includes intent-specific next-call suggestions with project_slug already filled in.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "inspect action \"claim_history\".",
      -    "properties": {
      -      "action": {
      -        "const": "claim_history",
      -        "description": "Run the claim_history action.",
      -        "type": "string"
      -      },
      -      "node_id": {
      -        "description": "(claim_history only) Task shareable id (e.g. TASK-42).",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "node_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "inspect action \"workspace\".",
      -    "properties": {
      -      "action": {
      -        "const": "workspace",
      -        "description": "Run the workspace action.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "workspace": {
      -        "description": "(workspace only) The workspace to fetch — its NAME (e.g. \"Billing\") or its uuid. NOT a short-id (workspaces aren't nodes).",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "workspace"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "inspect action \"stats\".",
      -    "properties": {
      -      "action": {
      -        "const": "stats",
      -        "description": "Run the stats action.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "inspect action \"loop\".",
      -    "properties": {
      -      "action": {
      -        "const": "loop",
      -        "description": "Run the loop action.",
      -        "type": "string"
      -      },
      -      "base": {
      -        "description": "Base git ref (default main).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "branch": {
      -        "description": "Worker branch git ref (default HEAD).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "node_id": {
      -        "description": "Task whose declared Check and Check paths form the loop contract.",
      -        "pattern": "^TASK-\\d+$",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "node_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "inspect action \"rag_status\".",
      -    "properties": {
      -      "action": {
      -        "const": "rag_status",
      -        "description": "Run the rag_status action.",
      -        "type": "string"
      -      },
      -      "recall_session": {
      -        "description": "The recall session handle from the awaiting-focus notice. Without it this reports only that automatic topic recall is unavailable here.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"context\": Walk the project graph from FTS (or topic-tag) seeds and return a scored neighborhood — not just flat search hits. Use BEFORE starting non-trivial work on a topic: it surfaces decisions, blockers, and prior lessons connected via edges that don't themselves contain the search keywords. Unlike search (flat FTS, no traversal), this seeds via FTS then follows edges, scoring by category + relation + recency. Hub nodes contribute only their most-recent edges, so a root component doesn't drag in the whole project. Bodies are truncated to ~400 chars and the total payload is capped at ~30k chars (lowest-scored non-seed nodes dropped, `_truncated: true` set); call fetch with the short id for a full body.",
      +    "properties": {
      +      "action": {
      +        "const": "context",
      +        "type": "string"
      +      },
      +      "depth": {
      +        "description": "(context only) BFS depth from seeds (default 1, max 3). 0 returns just seeds; 1 follows one edge.",
      +        "maximum": 3,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "hub_edge_limit": {
      +        "description": "(context only) Soft limit: nodes with more edges than this contribute only their N most-recent edges (default 12).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 50,
      +        "type": "integer"
      +      },
      +      "max_entries": {
      +        "description": "(context only) Cap on returned nodes (default 30, max 100).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 100,
      +        "type": "integer"
      +      },
      +      "node_id": {
      +        "description": "(context/provenance only) Shareable id (TASK-N/KNOW-N/COMP-N/DOC-N) to seed by: the node's title becomes the FTS query, then the walk proceeds from there. Use to expand the neighborhood around a specific node without already knowing good search terms. Overrides `query`.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query": {
      +        "description": "(context/provenance only) FTS query, in the same syntax as keyword search. Either query or topic must be set.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "seed_limit": {
      +        "description": "(context only) Cap on seed nodes from FTS / topic match (default 10).",
      +        "exclusiveMinimum": 0,
      +        "maximum": 50,
      +        "type": "integer"
      +      },
      +      "topic": {
      +        "description": "(context only) Topic tag to seed by (case-insensitive exact match on the topics array). Skips FTS — use when you want a clean topic-scoped neighborhood.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"provenance\": Walk the graph linearly from a seed and return a single ordered lineage answering 'why is X the way it is?'. At each hop it follows the strongest un-visited edge (fulfills > caused-by/supersedes > contradicts/blocks > mentions/relates-to), stopping at a risk-category node, when edges run out, or at max_hops. Use this when you want a cited chain you can narrate; use inspect(action=\"context\") for a broad unordered neighborhood to reason against. Supply exactly ONE of `node_id` (a shareable id) or `query` (free text resolved to the top FTS hit) — both or neither is a hard error.",
      +    "properties": {
      +      "action": {
      +        "const": "provenance",
      +        "type": "string"
      +      },
      +      "max_hops": {
      +        "description": "(provenance only) Walker depth cap (default 5, max 8). 0 returns just the seed.",
      +        "maximum": 8,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "node_id": {
      +        "description": "Starting node — shareable id (TASK-N | KNOW-N | COMP-N | DOC-N | NODE-N). Exactly one of `node_id` or `query` must be set.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "query": {
      +        "description": "Free-text 'why' prompt — resolved to a starting node via FTS top-1 hit. Exactly one of `node_id` or `query` must be set.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"briefing\": Return a compact, stateless briefing that teaches a visiting agent how to use Stele safely for the current project — for hosted/remote clients (ChatGPT, Claude web, Cursor, Codex, Gemini) that connect via MCP but lack hooks, skills, or automatic recall. The response is a PURE READ: it does NOT set an active project or store any session state, so every subsequent tool still requires project_slug explicitly. Call once at the start of a session or task when nothing is being surfaced to you automatically.",
      +    "properties": {
      +      "action": {
      +        "const": "briefing",
      +        "type": "string"
      +      },
      +      "environment": {
      +        "additionalProperties": false,
      +        "description": "(briefing only) Describes which Stele harness features the calling client has. All fields default to false/unknown when absent — the safest assumption for hosted clients.",
      +        "properties": {
      +          "auto_rag_available": {
      +            "description": "True if this client can point automatic recall at a topic and receive related context on later turns. False/absent → the briefing tells the agent to look things up with recall itself, every time.",
      +            "type": "boolean"
      +          },
      +          "hooks_available": {
      +            "description": "True if the host client runs Stele lifecycle hooks (recall, session_start, etc.). False/absent → the briefing includes manual fallback instructions.",
      +            "type": "boolean"
      +          },
      +          "skills_available": {
      +            "description": "True if the host client can invoke Stele skills (e.g. /stele:start). False/absent → the briefing instructs the agent to follow protocol manually.",
      +            "type": "boolean"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "intent": {
      +        "description": "(briefing only) Short description of the current request or goal (e.g. 'review launch plan', 'fix the auth bug'). When provided, the briefing includes intent-specific next-call suggestions with project_slug already filled in.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"claim_history\": Full append-only claim history for a task — every claim/release/complete/cancel with agent, model, session, worktree, and operator lineage. Capped at 200 events.",
      +    "properties": {
      +      "action": {
      +        "const": "claim_history",
      +        "type": "string"
      +      },
      +      "node_id": {
      +        "description": "(claim_history only) Task shareable id (e.g. TASK-42).",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "node_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"workspace\": Fetch one workspace by NAME or uuid, including its branch associations and whether it's active for this session.",
      +    "properties": {
      +      "action": {
      +        "const": "workspace",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "workspace": {
      +        "description": "(workspace only) The workspace to fetch — its NAME (e.g. \"Billing\") or its uuid. NOT a short-id (workspaces aren't nodes).",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "workspace"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"stats\": One-call overview of the active project — counts, top topics, overdue deadlines (any active knowledge with a past due_at), likely-abandoned tasks (claimed > 24h ago), and recent activity. Cheaper than running list(what=\"components\") + list_tasks + search separately.",
      +    "properties": {
      +      "action": {
      +        "const": "stats",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"loop\": Fail closed unless trusted local Git proves the branch left every declared Check path untouched. Exit 0 certifies oracle integrity, 1 names protected paths the branch modified, and 2 means unknown. Changed files are computed locally; callers cannot supply them.",
      +    "properties": {
      +      "action": {
      +        "const": "loop",
      +        "type": "string"
      +      },
      +      "base": {
      +        "description": "Base git ref (default main).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "branch": {
      +        "description": "Worker branch git ref (default HEAD).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "node_id": {
      +        "description": "Task whose declared Check and Check paths form the loop contract.",
      +        "pattern": "^TASK-\\d+$",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "node_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"rag_status\": Report this session's automatic topic recall: whether a focus is set, what it is, and whether recall is paused. Use it when you are unsure whether the context you are being shown still matches the work — if the focus names last hour's task, replace it.",
      +    "properties": {
      +      "action": {
      +        "const": "rag_status",
      +        "type": "string"
      +      },
      +      "recall_session": {
      +        "description": "The recall session handle from the awaiting-focus notice. Without it this reports only that automatic topic recall is unavailable here.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action"
      +    ],
      +    "type": "object"
      +  }
      +]
  4. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/destructiveHint/openWorldHint, so the 'Read-only' sentence is mostly redundant. The description does add real behavior beyond the annotations: loop 'fails closed' and is local-only, rag_status is local-only, node_id 'Overrides query', and each action carries an implied risk profile. Strong additions, though a couple of lines simply restate the read-only hint.

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 and read-only status, then a routing sentence, then a scannable action-by-action list. It is long, but nearly every clause in the action list carries routing or safety value. Slightly dense with eight actions in one paragraph, which costs a point.

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 an eight-action tool, the description covers each action's purpose, when to invoke it, and its local/fail-closed constraints. An output schema exists, so return-value explanation is correctly omitted. Nothing an agent needs to select an action is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (depth, seed_limit, max_entries, hub_edge_limit, max_hops, intent, environment, base/branch, consult_session) is already documented in place. The description adds action-level intent, which helps choose which params apply, but contributes no syntax or format meaning beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource up front ('Look at what surrounds one node or the whole project: its connections, its history, and the project's state') and then enumerates eight named actions. It explicitly distinguishes itself from siblings by name: fetch for a node's own content, search to find nodes, recall to gather question context, inspect when you need more than the node itself. An agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Gives per-action when-to-use guidance and even sequencing: 'read it before changing something it touches' (context), 'check it before relying on or overriding a decision' (provenance), 'call it once at the start of a session' (briefing), 'check it before force-claiming a task that looks abandoned' (claim_history). Alternatives are named explicitly. Nothing is left to inference.

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.