Skip to main content
Glama

situate

Read-only

THE FIRST CALL. What is going on right now — for named companies, or for the whole market — from the backend's situation endpoints. Call it before any other flexreport tool on anything about a company, an event, or "now".

TWO SCOPES (each parameter's description says which it belongs to):

WITH symbols -> GET /situate-company, one call per symbol. For "catch me up on
X", "what happened at X / why", "how did X's quarter look", and BEFORE aiming
explore_data_catalogue, list_realtime_events or a report tool at a company. When
the question is about one event, pass it as `event_type` AND `card_types` (halves
the payload: the cards of every other present type are dropped):
  situate(symbols=["OKTA"])                                           catch-up
  situate(symbols=["MAR"], event_type="financials_release",
          card_types=["financials_release"])                         the 10-Q
Returns {"situations": {SYMBOL: situation}} (a symbol that failed carries
{"error"} instead):
  present_types   event types with a node in the window
  web             {nodes, edges}: the newest node per event type and per table
                  over window_days. Edges carry `cause`: same_chain_run (observed:
                  one chain run wrote both — a table linked this way to the event
                  REFLECTS it), lineage (declared), co_occurrence (temporal only,
                  never causation). `at` is a write time, not a business date.
                  Node `fetch` hints name the follow-up call; a signed_query_url
                  goes to get_signed_sql_drilldown verbatim.
  cards           event-type cards: persisted_in, sources, entails (tables written
                  by layer, and realtime events that follow with rate and lag),
                  preceded_by
  relations       table cards: layer, refreshed_by (schedule, next_run_at), and
                  read_by — THE TOOL THAT READS IT. Prefer the first tool there
                  over explore_data_catalogue (company_financials for the EDGAR
                  statements, get_company_snapshot, predict_earnings_move, ...).
  entailed        tables the events entail, routed to this company's EDGAR or FMP
                  side; edgar_filer / routed_out / source_routing say which side
                  (never query a routed_out table for it)
Then: a node still inside the 12h cache -> list_realtime_events(event_type,
tickers=[symbol]); older -> its card's persisted_in table. For a table that
refreshed for the event, call its read_by tool first, e.g.
company_financials(symbol, financial_type=<the table>, limit=5, line_items=[...]).
A table whose next_run_at is after the event still shows the prior period. An
empty web is not a quiet week: widen window_days.

NO symbols -> GET /situate-market. For "any earnings today?", "most significant
investor decks today", "which hedge funds exited?", "what's going on?". Name the
types yourself when you can (`event_types`, else `family`); otherwise pass the
user's words as `question`:
  situate(event_types=["ir_publication"])        decks today: step 1 = decks
  situate(family="earnings")                     the earnings episode in order
  situate(question="what's going on?")           a sweep: one entry per episode
Returns {shape, routed_from, order, types, event_types, market, ...}:
  shape           named_types | family | sweep (nothing named: no default family)
  routed_from     what decided the order: `by` = explicit | question | none
  order           up to 4 event types, in reading order
  types[T]        card (trimmed ontology card: persisted_in, followers, ...),
                  cache {count, newest_at, oldest_at, tickers — or members with
                  member_kind cik | strategy | singleton}, reports {fresh, stale,
                  report_date}
  event_types     the whole realtime corpus (type, family, description)
  market          exchange, is_open, session
  degraded_sources  realtime_cache / report_inventory when one was unreachable:
                  counts are then unknown, NOT zero
Then: list_realtime_events(event_type=T, tickers=[...]) in `order`, skipping a
type whose cache.count is 0 (the 12h cache is cold for it — say so; it is not
evidence nothing happened). Narrow every follow-up with tickers=[...] to the names
just seen. For the research on the names that stand out, take the types that carry
`reports` into list_available_reports(event_types=[...],
report_date=<types[T].reports.report_date>), then get_latest_report. A family with no realtime types returns `message` naming
its durable tables.

Skip this tool ONLY for pure enumeration (list_options), an explicit "get me the
existing report" (get_latest_report), or a metric-history question with no event
in it ("Micron EPS over 8 quarters" -> company_financials(symbol="MU", limit=8,
line_items=["epsDiluted"]); cross-company or non-statement history ->
explore_data_catalogue). get_company_event_web gives a company's raw graph;
get_event_ontology gives any full card.

Requires auth (your MCP client attaches the OAuth bearer automatically).

Input Schema

NameRequiredDescriptionDefault
familyNoNO symbols, no type named: one family whose episode is walked in order — earnings, news, market_movement, institutional_ownership, analyst_activity, strategy, prediction, insider.
symbolsNoTickers to situate, e.g. ["MAR"] (max 5; one backend call each, in parallel). Omit for the whole market.
questionNoNO symbols: the user's words verbatim, keyword-routed to event types / a family only when neither event_types nor family is passed. Naming nothing is a market-wide sweep. Ignored with symbols.
sectionsNoWITH symbols: sections to return (default web, cards, relations, entailed). Add episodes for the episode definitions; informs_relations is the largest and least targeted.
card_typesNoWITH symbols: return cards only for these event types instead of every type present; entailed and relations shrink with them. E.g. ["financials_release"] with event_type.
event_typeNoWITH symbols: the realtime event type the question is about, e.g. "financials_release" for a 10-Q/10-K, "ir_publication" for a deck, "8k_release". Its card is returned even when it has no node in the window. Valid values: list_options("event_types").
event_typesNoNO symbols: the realtime event types the question is about, in the order named, e.g. ["ir_publication"] for decks, ["13f_exited"] for hedge-fund exits. Step 1 of the order is the first. Valid values: list_options("event_types").
top_tickersNoNO symbols: members listed per event type from the realtime cache, newest first (default 10, max 50).
window_daysNoWITH symbols: event-web look-back in days (default 14, max 90).
include_keysNoFields kept inside each card. With symbols the default is persisted_in, sources, entails, preceded_by, layer, read_by, refreshed_by ([] = whole cards; keep read_by: it names the tool that reads each table). With no symbols the default is the trimmed market card.
include_fetchNoWITH symbols: keep each web node's `fetch` hint (the follow-up call and, on data updates, a signed_query_url for get_signed_sql_drilldown). false shrinks the web 2-4x.
report_inventoryNoNO symbols: include fresh/stale report-plan counts per plan-earning type.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed15 schema fields changed
    • addedInput schema / properties / card_types
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "WITH symbols: return cards only for these event types instead of every type present; entailed and relations shrink with them. E.g. [\"financials_release\"] with event_type.",
      +  "title": "Card Types"
      +}
    • addedInput schema / properties / event_type
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "WITH symbols: the realtime event type the question is about, e.g. \"financials_release\" for a 10-Q/10-K, \"ir_publication\" for a deck, \"8k_release\". Its card is returned even when it has no node in the window. Valid values: list_options(\"event_types\").",
      +  "title": "Event Type"
      +}
    • addedInput schema / properties / event_types
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "NO symbols: the realtime event types the question is about, in the order named, e.g. [\"ir_publication\"] for decks, [\"13f_exited\"] for hedge-fund exits. Step 1 of the order is the first. Valid values: list_options(\"event_types\").",
      +  "title": "Event Types"
      +}
    • addedInput schema / properties / family
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "NO symbols, no type named: one family whose episode is walked in order — earnings, news, market_movement, institutional_ownership, analyst_activity, strategy, prediction, insider.",
      +  "title": "Family"
      +}
    • addedInput schema / properties / include_fetch
      Added value: +{
      +  "default": true,
      +  "description": "WITH symbols: keep each web node's `fetch` hint (the follow-up call and, on data updates, a signed_query_url for get_signed_sql_drilldown). false shrinks the web 2-4x.",
      +  "title": "Include Fetch",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / include_keys
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "maxItems": 30,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Fields kept inside each card. With symbols the default is persisted_in, sources, entails, preceded_by, layer, read_by, refreshed_by ([] = whole cards; keep read_by: it names the tool that reads each table). With no symbols the default is the trimmed market card.",
      +  "title": "Include Keys"
      +}
    • changedInput schema / properties / question / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 500,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / question / description
      Previous value: -"The user's question VERBATIM; keyword-matched to the realtime event types it names, which decides where the plan starts."New value: +"NO symbols: the user's words verbatim, keyword-routed to event types / a family only when neither event_types nor family is passed. Naming nothing is a market-wide sweep. Ignored with symbols."
    • addedInput schema / properties / report_inventory
      Added value: +{
      +  "default": true,
      +  "description": "NO symbols: include fresh/stale report-plan counts per plan-earning type.",
      +  "title": "Report Inventory",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / sections
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "enum": [
      +          "web",
      +          "cards",
      +          "relations",
      +          "entailed",
      +          "informs_relations",
      +          "episodes"
      +        ],
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "WITH symbols: sections to return (default web, cards, relations, entailed). Add episodes for the episode definitions; informs_relations is the largest and least targeted.",
      +  "title": "Sections"
      +}
    • changedInput schema / properties / symbols / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "type": "string"
      +    },
      +    "maxItems": 5,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / symbols / description
      Previous value: -"Tickers to situate (max 5; extras are dropped). Omit for the whole market."New value: +"Tickers to situate, e.g. [\"MAR\"] (max 5; one backend call each, in parallel). Omit for the whole market."
    • addedInput schema / properties / top_tickers
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 50,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "NO symbols: members listed per event type from the realtime cache, newest first (default 10, max 50).",
      +  "title": "Top Tickers"
      +}
    • changedInput schema / properties / window_days / description
      Previous value: -"Event-web look-back in days (backend default 7, max 90)."New value: +"WITH symbols: event-web look-back in days (default 14, max 90)."
    • changedOutput schema / (root)
      Previous value: -{
      -  "$defs": {
      -    "SituateMarket": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "exchange": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Exchange"
      -        },
      -        "is_open": {
      -          "anyOf": [
      -            {
      -              "type": "boolean"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Null when market status was unavailable.",
      -          "title": "Is Open"
      -        },
      -        "session": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "regular | closed | unknown.",
      -          "title": "Session"
      -        },
      -        "timezone": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Timezone"
      -        }
      -      },
      -      "title": "SituateMarket",
      -      "type": "object"
      -    },
      -    "SituatePlanStep": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "args": {
      -          "additionalProperties": true,
      -          "description": "Valid arguments for `tool` — pass them through unchanged.",
      -          "title": "Args",
      -          "type": "object"
      -        },
      -        "auth": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "required | public.",
      -          "title": "Auth"
      -        },
      -        "optional": {
      -          "anyOf": [
      -            {
      -              "type": "boolean"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Optional"
      -        },
      -        "provenance": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Provenance"
      -        },
      -        "step": {
      -          "description": "1-based execution order.",
      -          "title": "Step",
      -          "type": "integer"
      -        },
      -        "sync": {
      -          "anyOf": [
      -            {
      -              "type": "boolean"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "False means the call returns a task_id to poll with get_task_status.",
      -          "title": "Sync"
      -        },
      -        "tool": {
      -          "description": "Exact tool name to call.",
      -          "title": "Tool",
      -          "type": "string"
      -        },
      -        "why": {
      -          "title": "Why",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "step",
      -        "tool",
      -        "args",
      -        "why"
      -      ],
      -      "title": "SituatePlanStep",
      -      "type": "object"
      -    },
      -    "SituateSkip": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "args": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Args"
      -        },
      -        "tool": {
      -          "description": "A call NOT to make.",
      -          "title": "Tool",
      -          "type": "string"
      -        },
      -        "why": {
      -          "title": "Why",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "tool",
      -        "why"
      -      ],
      -      "title": "SituateSkip",
      -      "type": "object"
      -    },
      -    "SituateSuggestion": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "args": {
      -          "additionalProperties": true,
      -          "title": "Args",
      -          "type": "object"
      -        },
      -        "tool": {
      -          "title": "Tool",
      -          "type": "string"
      -        },
      -        "when": {
      -          "description": "Make this call ONLY if this condition arises after the plan has run.",
      -          "title": "When",
      -          "type": "string"
      -        },
      -        "why": {
      -          "title": "Why",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "tool",
      -        "when",
      -        "why"
      -      ],
      -      "title": "SituateSuggestion",
      -      "type": "object"
      -    },
      -    "SituateSymbolBlock": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "cache": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Event types still in (present) or aged out of (expired) the realtime cache.",
      -          "title": "Cache"
      -        },
      -        "cards": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Trimmed ontology cards, keyed by event type.",
      -          "title": "Cards"
      -        },
      -        "deepen": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Tools the ontology says deepen this event.",
      -          "title": "Deepen"
      -        },
      -        "episode": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Dominant episode: anchor and members (arrived | pending | overdue).",
      -          "title": "Episode"
      -        },
      -        "error": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Set when the event web errored for this symbol.",
      -          "title": "Error"
      -        },
      -        "freshness": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "additionalProperties": true,
      -                "type": "object"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Per relation: last_refresh_at, next_run_at, reflects_newest_event.",
      -          "title": "Freshness"
      -        },
      -        "newest_event": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Newest Event"
      -        },
      -        "web": {
      -          "additionalProperties": true,
      -          "description": "Newest event-web nodes and the edges among them (full graph via get_company_event_web).",
      -          "title": "Web",
      -          "type": "object"
      -        }
      -      },
      -      "required": [
      -        "web"
      -      ],
      -      "title": "SituateSymbolBlock",
      -      "type": "object"
      -    },
      -    "SituateUniverseBlock": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "asked_types": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Realtime event types the question named.",
      -          "title": "Asked Types"
      -        },
      -        "cards": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Cards"
      -        },
      -        "episode": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Episode"
      -        },
      -        "event_types": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "additionalProperties": true,
      -                "type": "object"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "The whole realtime corpus: event_type, family, description.",
      -          "title": "Event Types"
      -        },
      -        "family": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "title": "Family"
      -        },
      -        "order": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Event types in the order the plan walks them.",
      -          "title": "Order"
      -        },
      -        "shape": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "named_types | family | sweep.",
      -          "title": "Shape"
      -        }
      -      },
      -      "title": "SituateUniverseBlock",
      -      "type": "object"
      -    }
      -  },
      -  "additionalProperties": true,
      -  "properties": {
      -    "as_of": {
      -      "title": "As Of",
      -      "type": "string"
      -    },
      -    "degraded": {
      -      "description": "True when a source was unavailable; guidance[] says which.",
      -      "title": "Degraded",
      -      "type": "boolean"
      -    },
      -    "guidance": {
      -      "description": "Situation-scoped rules to read before writing.",
      -      "items": {
      -        "type": "string"
      -      },
      -      "title": "Guidance",
      -      "type": "array"
      -    },
      -    "market": {
      -      "$ref": "#/$defs/SituateMarket"
      -    },
      -    "ontology_as_of": {
      -      "anyOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "title": "Ontology As Of"
      -    },
      -    "plan": {
      -      "description": "ORDERED tool calls to execute as-is.",
      -      "items": {
      -        "$ref": "#/$defs/SituatePlanStep"
      -      },
      -      "title": "Plan",
      -      "type": "array"
      -    },
      -    "realtime_cache_ttl_hours": {
      -      "title": "Realtime Cache Ttl Hours",
      -      "type": "integer"
      -    },
      -    "scope": {
      -      "description": "symbol (symbols were named) or universe (the market).",
      -      "title": "Scope",
      -      "type": "string"
      -    },
      -    "skip": {
      -      "description": "Calls that would return nothing or waste a job — do not make them.",
      -      "items": {
      -        "$ref": "#/$defs/SituateSkip"
      -      },
      -      "title": "Skip",
      -      "type": "array"
      -    },
      -    "suggest": {
      -      "description": "Calls to make only if their `when` arises.",
      -      "items": {
      -        "$ref": "#/$defs/SituateSuggestion"
      -      },
      -      "title": "Suggest",
      -      "type": "array"
      -    },
      -    "symbols": {
      -      "anyOf": [
      -        {
      -          "additionalProperties": {
      -            "$ref": "#/$defs/SituateSymbolBlock"
      -          },
      -          "type": "object"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "description": "Per-symbol blocks (symbol scope only).",
      -      "title": "Symbols"
      -    },
      -    "universe": {
      -      "anyOf": [
      -        {
      -          "$ref": "#/$defs/SituateUniverseBlock"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "description": "Market-wide block (universe scope only)."
      -    }
      -  },
      -  "required": [
      -    "as_of",
      -    "scope",
      -    "realtime_cache_ttl_hours",
      -    "degraded",
      -    "market",
      -    "plan",
      -    "skip",
      -    "suggest",
      -    "guidance"
      -  ],
      -  "title": "SituateResult",
      -  "type": "object"
      -}New value: +null
  2. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only supply readOnlyHint=true, and the description adds substantial context beyond that: OAuth bearer auth is automatic, nodes inside the 12h cache route to list_realtime_events while older ones route to persisted_in tables, `at` is a write time not a business date, a table whose next_run_at postdates the event still shows the prior period, and an empty web means widen window_days rather than a quiet week. It also warns that degraded_sources make counts unknown rather than zero — exactly the kind of failure-mode disclosure annotations cannot carry.

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 the single most important fact ("THE FIRST CALL") and organized under clear WITH symbols / NO symbols headings with worked call examples. It is long, but almost every sentence carries routing, cache, or return-shape information that has no other home given the absence of an output schema; the dense inline formatting is the main readability cost.

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 12-parameter tool with no output schema and two entirely different response shapes, the description documents both return payloads field by field (present_types, web nodes/edges with cause values, cards, relations/read_by, entailed routing; shape/routed_from/order/types/market/degraded_sources). It also closes the loop on follow-up calls, leaving nothing an agent needs in order to invoke and interpret it.

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; the description earns more by documenting cross-parameter interactions the schema cannot express — passing the same event as both `event_type` and `card_types` halves the payload, `include_fetch=false` shrinks the web 2-4x, and `include_keys` should retain read_by because it names the tool that reads each table. It does not add syntax or format detail beyond what the schema properties already state for individual fields.

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?

Opens with a specific verb+resource+scope ("What is going on right now — for named companies, or for the whole market") and immediately distinguishes itself from every sibling by asserting it is "THE FIRST CALL" to be made before other flexreport tools. The two-scope split (WITH symbols -> /situate-company, NO symbols -> /situate-market) makes the tool's identity unambiguous.

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?

Explicitly names when to use it ("catch me up on X", "what happened at X / why", before aiming explore_data_catalogue or list_realtime_events at a company) and when to skip it (pure enumeration via list_options, explicit report retrieval via get_latest_report, metric-history questions routed to company_financials or explore_data_catalogue). It also hands off to get_company_event_web and get_event_ontology for raw graph/full card needs, so alternatives are covered rather than implied.

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