Skip to main content
Glama

Get session digest

well_get_session_digest
Read-onlyIdempotent

Get everything a returning person's first answer needs, in one call: what happened in the workspace since they last looked, where the workspace stands now, and the Well skills that can take it forward.

When the person asks what happened since last time, asks to be caught up, or opens a session, do not call this first: load the signing-back skill with well_get_skill and follow it. That procedure greets, reads this digest, and proposes the next steps; calling this tool alone skips the greeting and the proposals. Call this tool directly only when a loaded Well skill says to, or when the person asks for the raw counts and nothing else.

Returns records (one entry per record type with its created / updated / deleted counts and the connectors those creations came from), errors (the pipeline failures worth acting on), skills_run (the Well skills this person already ran recently, so you do not propose one they just finished), and boundary + since_at saying where the window starts. is_first_session true means there is no earlier moment to report from: greet the person and skip the recap. truncated true means the window stopped at 5000 events and the counts cover part of the tail only.

Also returns situation, the state behind the recap, so no follow-up read is needed: connectors (the tools this workspace connected, each with its connection_status and last_successful_sync_at, beside connected_count; the size of Well's catalog is not carried, because it is never a figure to tell the person), open_period (the month Well opens the close on, with its label, is_complete and selectable), and missing_invoices (that month's row_count of counterparties with settled spend and no invoice, plus its hints). Each part is null when its read refused or had nothing to read. A null says the part is UNKNOWN: never report it as an empty connector list, a workspace with no open month, or a month owing nothing.

And skills: the whole Well skill roster, the same entries well_search_skill returns, so a step a click names is loaded with well_get_skill rather than searched for again. roster_readable false says the roster could not be read at all, so skills is empty because nothing loaded: propose no next step in that turn, because every slug would be invented.

And suggested_steps: the five next steps Well ranked for this workspace, each a skill from the roster and the reason it ranks there. The rubric runs on the server: open gaps first (no bank, a month owing invoices, no accounting tool, a stale sync), then the open month's close, then the analysis skills, and never a skill served in the last day. Hand these five to well_propose_next_steps in this order and rank nothing yourself. The sentence each one is offered as is yours to write, in the language the person is using, from that skill's own quoted utterances in skills and the figures above. When the list is empty, nothing was offerable: call no render tool and write no five of your own, say so in one line.

Pass mark: true to advance this person's read cursor to the end of the window, so the next digest starts where this one ended. That cursor is shared with the app, so marking here also clears what the app shows as unread. Pass mark: false (or omit it) to inspect the digest without moving anything.

The figures are computed by Well. State them as returned: do not re-count, round, or total them yourself.

When the token authorizes one workspace, call this directly — no other tool call is needed first. When it authorizes several, this read will not guess which one you mean: pass workspace_id on the call.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
markNoAdvance this person's read cursor to the end of the window, so the next digest starts where this one ended. Pass true when you are about to report the digest to the person, false when you are only inspecting it.
workspace_idNoTarget workspace. Omit when the token authorizes one workspace. Required when it authorizes several: this read reports one workspace's own figures and will not choose which.
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
errorNo
errorsYes
reasonYes
skillsYesThe whole Well skill roster, the same entries well_search_skill returns. The step a click names is loaded from it with well_get_skill.
recordsYes
successYes
boundaryYesWhere the window starts: the person's read cursor, their previous sign-in, or neither. Null on a refusal.
since_atYesThe instant the window starts from, set only when a previous sign-in bounded it.
situationYesWhere the workspace stands now: its connected tools, its open month, and what that month still owes.
time_zoneYesThe IANA time zone the label was written in, from the workspace's settings.
truncatedYesTrue when events sit past the read cap of 5000, so the counts cover part of the tail only.
skills_runYes
since_at_labelYesThe same instant written in the workspace's own time zone, such as "Tuesday 8 September at 09:50", ready to quote in the greeting.
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
roster_readableYesFalse when the roster could not be read at all, so `skills` is empty because nothing was readable rather than because the build ships no skill. Propose no next step on false: every slug would be invented and refused.
suggested_stepsYesThe five next steps Well ranked for this workspace, in card order, from its gaps, its open month and the skills already run. Hand these five to well_propose_next_steps in this order, never reordered or replaced. You write the sentence each one is offered as, in the language the person is using, from that skill's own quoted trigger utterances in `skills` and the figures this digest returned. Empty means nothing was offerable: draw no card and write no five of your own.
is_first_sessionYes
resolved_workspaceNoThe workspace that answered, when the caller named none and the token authorizes several.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / properties / conversation_id
      Added value: +{
      +  "description": "The conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id
      Added value: +{
      +  "description": "The conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id_note
      Added value: +{
      +  "description": "Present only when the server opened a fresh lane, stating that no choice recorded earlier was read.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id_source
      Added value: +{
      +  "description": "Where the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.",
      +  "enum": [
      +    "host_meta",
      +    "argument",
      +    "minted"
      +  ],
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedOutput schema / properties / situation / properties / connectors / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "connected": {
      -        "description": "The tools this workspace has connected, read from its own connection rows. A row still waiting on its handshake, and one torn down, are not carried.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "connection_status": {
      -              "anyOf": [
      -                {
      -                  "enum": [
      -                    "enabled",
      -                    "processing",
      -                    "error",
      -                    "need_reconnect",
      -                    "to_configure",
      -                    "suspended",
      -                    "disabled"
      -                  ],
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "is_connected": {
      -              "type": "boolean"
      -            },
      -            "kinds": {
      -              "description": "The data domains this tool serves (bank, accounting, invoicing), as the connect card classifies it.",
      -              "items": {
      -                "enum": [
      -                  "bank",
      -                  "accounting",
      -                  "invoicing"
      -                ],
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            "last_successful_sync_at": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "name": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "kinds",
      -            "is_connected",
      -            "connection_status",
      -            "last_successful_sync_at"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "connected_count": {
      -        "description": "Connected tools, which is the length of `connected`.",
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "connected",
      -      "connected_count"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "connected": {
      +        "description": "The tools this workspace has connected, read from its own connection rows. A row still waiting on its handshake, and one torn down, are not carried.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "connection_status": {
      +              "anyOf": [
      +                {
      +                  "enum": [
      +                    "enabled",
      +                    "processing",
      +                    "error",
      +                    "need_reconnect",
      +                    "to_configure",
      +                    "disabled"
      +                  ],
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "is_connected": {
      +              "type": "boolean"
      +            },
      +            "kinds": {
      +              "description": "The data domains this tool serves (bank, accounting, invoicing), as the connect card classifies it.",
      +              "items": {
      +                "enum": [
      +                  "bank",
      +                  "accounting",
      +                  "invoicing"
      +                ],
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "last_successful_sync_at": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "name": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "kinds",
      +            "is_connected",
      +            "connection_status",
      +            "last_successful_sync_at"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "connected_count": {
      +        "description": "Connected tools, which is the length of `connected`.",
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "connected",
      +      "connected_count"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Added

TDQS

A4/5.0
Behavior1/5

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

The description discloses a state-changing behavior: passing mark: true advances the read cursor and clears the app's unread state. This contradicts the annotations' readOnlyHint: true, which implies no mutation. Per the rubric, a description that contradicts annotations earns a 1 even though the disclosure itself is detailed.

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

Conciseness4/5

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

The description is long but front-loaded with purpose and usage, then organized into clear sections for return fields, null semantics, skills, suggested steps, mark behavior, and workspace selection. It could be tightened by trimming some output-field explanation that may duplicate the output schema, but each section earns its place given the tool's complexity.

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

Completeness5/5

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

For a 3-parameter tool with 100% schema coverage and an output schema, the description is exhaustive: it covers call routing, mark side effects, workspace disambiguation, null/unknown semantics, truncation, roster failures, suggested-step ordering, and the rule to state figures as returned. Nothing operational needed to call or interpret the tool 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 coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema: mark advances the cursor and is shared with the app, false means inspect-only, and workspace_id should be passed when the token authorizes multiple workspaces because the tool will not guess. This exceeds the schema's descriptions.

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

Purpose5/5

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

The description states a specific verb and resource: it returns everything a returning person's first answer needs, including workspace activity, current state, and relevant Well skills. It also distinguishes itself from related tools by naming the signing-back skill workflow and well_search_skill, so an agent can tell this tool apart from its siblings.

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?

The description gives explicit when-to-call and when-not-to-call guidance: for catch-up requests it says load the signing-back skill first instead, and direct calls are reserved for when a loaded skill says so or when the person only wants raw counts. It also explains mark true/false semantics and workspace_id requirements for multi-workspace tokens.

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.

Resources