Skip to main content
Glama

get_latest_report

Read-only

Get the latest Flexreport research report(s) for one or more tickers. USE THIS BY DEFAULT.

===> THIS IS THE DEFAULT, CORRECT TOOL whenever a user asks for "the report",
"research", "the latest research", "analysis", "a writeup", or "the PDF" for a
ticker (e.g. "get me the latest research on SNOW"). It is the FAST path. For a
symbol with a FRESH saved report plan it does not hand back a pre-built PDF: it
pulls the plan itself — the JSON the platform saved when the symbol's latest
material event published (brief, queries, results, format map) — and renders it
straight into the user's template in ~10-20 s. Every other symbol comes back
with its cached PDF. ALWAYS call this before `generate_report_for_stock`, which
is a ~10 min full rebuild.

If the user's intent is an OPEN-ENDED or exploratory QUESTION rather than a request
for this existing report, do NOT use this tool — default to `explore_data_catalogue`
(fast, interactive), and reach for `generate_research_report` only when the user
EXPLICITLY asks for a full deep-dive writeup. A BESPOKE report ("the SNOW report,
but built around product revenue and RPO") is not a rebuild either: explore the
items the user named, ideate with them on the result sets, and lay the agreed
results out in their template (`get_user_template`) with your own document tooling.

Accepts one OR many symbols. Returns
{"result":    [{"symbol": "AAPL", "url": "<presigned pdf url>",
                "report": "<base64 pdf>", "generated_at": "<iso utc>",
                "age_hours": 5.2, "latest_event_at": "<iso>", "stale": true}, ...],
 "missing":   ["XYZ", ...],
 "rendering": {"PLAY": {"task_id": "...", "status": "PENDING", "symbol": "PLAY"}}}
Every symbol lands in exactly ONE of the three. A `result` hit carries BOTH
representations of the same PDF: `url` is a short-lived presigned link (valid
~6h) — hand it to the user to download/open the document directly (and prefer it
on clients that can't handle a large base64 blob); `report` is the inline base64
PDF — decode it to read, render, or summarize the report's contents yourself.
Split a list longer than 100 symbols across calls.

READ ALL THREE BEFORE YOU HAND ANYTHING OVER. Nothing regenerates on its own:
  in `rendering` -> the symbol's saved plan is fresh and is being rendered into the
                    user's template (~10-20 s). Poll get_task_status(task_id); the
                    finished result carries {"pdf": "<base64>", ...} — hand the
                    user THAT. Never call generate_report_for_stock for it: the
                    render already is the fresh report.
  stale: false   -> the cached PDF reflects the symbol's latest report inputs. Serve it.
  stale: true    -> the saved plan itself is out of date (a print, a filing, a 13F
                    refresh landed after it; `latest_event_at` says when), so there
                    is nothing fresh to render. Hand over the stale PDF with that
                    caveat and offer generate_report_for_stock(ticker) — a full
                    rebuild, ~10 min. Start it when the user wants the refreshed
                    report; never fan rebuilds out across a list of names unasked.
  stale: null    -> no report inputs are known for the symbol, so freshness cannot
                    be judged. Serve the PDF and quote `generated_at` / `age_hours`.
  in `missing`   -> no plan to render and no cached PDF. generate_report_for_stock(ticker)
                    builds the first one (~10 min, saved so later calls here render
                    it in seconds) — say so before starting it — or `onboard_symbol`
                    if the ticker is not covered.
To see which symbols have a fresh plan READY to render — by the event that
triggered it, across the universe, before anything is pulled — use
`list_available_reports`: it lists saved plans, not cached PDFs.

Rate-limited to 500/hour. Requires auth (your MCP client attaches the OAuth bearer
automatically).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
symbolsYesOne or many tickers, e.g. ["SNOW", "AAPL"]; uppercased and de-duplicated server-side, at most 100 after dedupe (413 above that).

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, so the description carries the real burden and delivers: rate limit of 500/hour, OAuth auto-attached by the client, ~10-20s render vs ~10min rebuild, the fact that nothing regenerates on its own, and the meaning of stale true/false/null and the `rendering`/`missing` buckets. This is far beyond what the annotation provides.

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?

Long but highly structured and front-loaded, with the default-tool claim in the first line and the branch semantics broken out per field. Slight redundancy: 'USE THIS BY DEFAULT', the ===> header, and 'ALWAYS call this before...' restate the same priority three times, but nothing is genuinely wasted.

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?

Given no output schema, the description reproduces the return shape in full (result/missing/rendering, url vs base64 semantics, presigned ~6h validity) and covers every branch an agent must handle before handing a document over. Nothing needed to call or interpret the tool correctly is missing.

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

Parameters4/5

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

Single parameter with 100% schema description coverage (uppercasing, dedupe, 100-symbol cap, 413 status), so the schema baseline is 3. The description still adds operational meaning by stating lists longer than 100 symbols must be split across calls, which the schema does not express as workflow guidance.

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+resource (retrieve the latest Flexreport research report for one or more tickers) and immediately positions itself against siblings, declaring itself the default and naming `generate_report_for_stock`, `explore_data_catalogue`, and `generate_research_report` as the alternatives. An agent can route to it 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?

Explicit when-to-use (queries for 'the report', 'research', 'analysis', 'the PDF') and when-not-to-use (open-ended exploratory questions → explore_data_catalogue; bespoke reports → explore + get_user_template; full deep-dive → generate_research_report). Includes the ordering constraint to call this before generate_report_for_stock.

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