Skip to main content
Glama

Valuein — SEC EDGAR Fundamentals & Smart-Money Data

Create Research Report

create_report
Idempotent

Synchronously generate a research report and persist it under the caller's authorship. Two subtypes:

• reverse_dcf — solves the stage-1 free-cash-flow growth rate the market price implies, with a 5×5 sensitivity grid across WACC × terminal-growth assumptions. Returns full markdown + structured JSON + every numerical claim's citation chain to the originating SEC accession.

• thesis — snapshot a saved thesis (via save_thesis) as a frozen narrative report with at-a-glance table, author notes, anchor fundamentals (latest annual), and lineage to the source filing. Later edits to the thesis do NOT propagate — generate a new report to capture new state.

Tier: sample tier rejected — reports are per-author state.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
titleNoOptional human-supplied title; auto-generated when omitted.
paramsNoReverse-DCF parameters — required for report_type=reverse_dcf.
tickerNoUS-listed ticker — required for report_type=reverse_dcf. Case-insensitive.
thesis_idNoId of a saved thesis owned by the caller — required for report_type=thesis.
report_typeYesSubtype. `reverse_dcf` requires ticker + params; `thesis` requires thesis_id (from save_thesis / list_theses).
idempotency_keyNoOptional key for at-most-once semantics. Same key from the same user always yields the same report id.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
_metaYesProvenance envelope — data lineage for every MCP response
reportYes
markdownYes
sectionsYes
citationsYes
structuredYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / _meta / properties / fundamentals_as_of / description
      Previous value: -"ISO timestamp when the FINANCIAL STATEMENTS were last rebuilt. Use THIS — not `last_updated` — when telling a user how current the fundamentals are. The snapshot is republished on every weekday price refresh while the statements are carried forward unchanged, so `last_updated` can be far more recent than the numbers it sits next to."New value: +"ISO timestamp when the FINANCIAL STATEMENTS were last rebuilt in bulk. Use THIS — not `last_updated` — when telling a user how current the cross-sectional fundamentals are. The snapshot is republished on every weekday price refresh while the statements are carried forward unchanged, so `last_updated` can be far more recent than the numbers it sits next to. It is a floor for a single filer, not a ceiling: a filer with a live partition receives its filing, facts and ratios intraday (minutes after EDGAR dissemination), so an entity-scoped read may carry a filing newer than this; cross-sectional ranks (factor scores, earnings signals) refresh with the weekly bulk export."
  2. Changed2 schema fields changed
    • addedOutput schema / properties / _meta / properties / fundamentals_as_of
      Added value: +{
      +  "description": "ISO timestamp when the FINANCIAL STATEMENTS were last rebuilt. Use THIS — not `last_updated` — when telling a user how current the fundamentals are. The snapshot is republished on every weekday price refresh while the statements are carried forward unchanged, so `last_updated` can be far more recent than the numbers it sits next to.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / _meta / properties / price_as_of
      Added value: +{
      +  "description": "ISO timestamp when the price surfaces were last refreshed.",
      +  "type": "string"
      +}
  3. Changed2 schema fields changed
    • addedOutput schema / properties / _meta / properties / cost_usd
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Per-call cost transparency. Omitted for subscription-only tools that have no PAYG-equivalent price.",
      +  "properties": {
      +    "amount_usd": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "basis": {
      +      "description": "payg_charge = real agent-pay charge. payg_rate_card = indicative price, not billed.",
      +      "enum": [
      +        "payg_charge",
      +        "payg_rate_card"
      +      ],
      +      "type": "string"
      +    },
      +    "billed": {
      +      "description": "true = this amount was actually charged via PAYG for this call. false = indicative PAYG-equivalent value; your plan already covers this call for free.",
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "amount_usd",
      +    "billed",
      +    "basis"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / _meta / properties / latency_ms
      Added value: +{
      +  "description": "Wall-clock milliseconds this tool call took, measured server-side around the handler.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
  4. Changed1 schema field changed
    • addedOutput schema / properties / _meta / properties / pit_safe / description
      Added value: +"true iff a zero-look-ahead point-in-time cut was applied to every returned figure"
  5. Changed9 schema fields changed
    • addedInput schema / properties / params / description
      Added value: +"Reverse-DCF parameters — required for report_type=reverse_dcf."
    • removedInput schema / properties / report_type / const
      Removed value: -"reverse_dcf"
    • changedInput schema / properties / report_type / description
      Previous value: -"Report type. PR 3 supports `reverse_dcf` only; additional types ship later."New value: +"Subtype. `reverse_dcf` requires ticker + params; `thesis` requires thesis_id (from save_thesis / list_theses)."
    • addedInput schema / properties / report_type / enum
      Added value: +[
      +  "reverse_dcf",
      +  "thesis"
      +]
    • addedInput schema / properties / thesis_id
      Added value: +{
      +  "description": "Id of a saved thesis owned by the caller — required for report_type=thesis.",
      +  "maxLength": 64,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / properties / ticker / description
      Previous value: -"US-listed ticker — case-insensitive, normalised to upper."New value: +"US-listed ticker — required for report_type=reverse_dcf. Case-insensitive."
    • changedInput schema / required
      Previous value: -[
      -  "report_type",
      -  "ticker",
      -  "params"
      -]New value: +[
      +  "report_type"
      +]
    • removedOutput schema / properties / report / properties / report_type / const
      Removed value: -"reverse_dcf"
    • addedOutput schema / properties / report / properties / report_type / enum
      Added value: +[
      +  "reverse_dcf",
      +  "thesis"
      +]
  6. Added

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare idempotentHint=true, and the description reinforces this with the idempotency_key parameter and 'same key always yields the same report id.' It adds the snapshot semantics (thesis edits do not propagate) and mentions a tier rejection (per-author state), providing behavioral context beyond the annotation hints.

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 structured with bullet points for the two subtypes, front-loading the primary purpose in the first sentence. While longer than typical, the length is justified by the dual-mode complexity and each sentence contributes meaningful detail.

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?

The description covers the required parameters per subtype, the output format (markdown, JSON, citation chains), idempotency behavior, and the tier restriction. With an output schema present, it provides sufficient context for an agent to call the tool correctly, including the need to reference saved theses.

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 baseline is 3. The description clarifies the dependency between report_type and other parameters (ticker+params vs thesis_id), and notes that thesis_id comes from save_thesis/list_theses, adding contextual value beyond the schema's own 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 clearly states 'Synchronously generate a research report and persist it under the caller's authorship,' naming the specific verb and resource. It further distinguishes two subtypes (reverse_dcf and thesis) with concrete behaviors, making it unambiguous against sibling tools like compute_dcf or generate_dcf_xlsx.

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

Usage Guidelines4/5

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

It explains when to use each subtype: reverse_dcf for solving growth rate with a sensitivity grid, thesis for snapshotting a saved thesis. It notes that thesis edits do not propagate and a new report must be generated. However, it doesn't explicitly contrast with alternative report-generation tools (e.g., compute_dcf), relying on the persistence aspect to imply the distinction.

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.