Skip to main content
Glama

Valuein — SEC EDGAR Fundamentals & Smart-Money Data

Save Markdown as a Draft Report

save_freeform_report
Idempotent

Save free-form markdown (e.g. a chat synthesis) as a DRAFT report you can refine in the editor and export to Word/PDF. Unlike create_report (which computes a structured reverse_dcf or thesis report), this accepts raw markdown and splits it into sections. PASS citations with the fact_ids behind the figures you wrote — without them every number in the report reads as unsourced and the report can never be signed off. Tier: sample rejected (reports are per-author state). Idempotency-key → stable report id.

Input Schema

NameRequiredDescriptionDefault
titleYesReport title.
tickerNoOptional ticker for context/catalog. Case-insensitive.
abstractNoOptional 1–2 sentence summary.
markdownYesFree-form markdown body (≤100k chars). Headings become sections.
citationsNoLineage you already hold for the figures in `markdown` — pass it rather than dropping it. Each claim should quote the figure exactly as the prose writes it, so figure review can link the two. Every `fact_ids` entry must be a whole id copied exactly as a tool returned it (a 64-hex fact_id or a `drv1:` derived id): a truncated or annotated id rejects the call and nothing is saved. Ids are shape-checked only, NOT resolved here; sign-off re-resolves every fact_id before certifying.
idempotency_keyNoOptional key for at-most-once semantics. Same key from the same user always yields the same report id.

Output Schema

NameRequiredDescriptionDefault
_metaYesProvenance envelope — data lineage for every MCP response
reportYes
statusYes
versionYes
report_idYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedInput schema / properties / citations / items / properties / inputs
      Added value: +{
      +  "description": "The filed numbers, as the source writes them, that a computed figure was derived from (0-4).",
      +  "items": {
      +    "maxLength": 60,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 4,
      +  "type": "array"
      +}
    • addedInput schema / properties / citations / items / properties / section
      Added value: +{
      +  "description": "Filing section key exactly as list_filing_sections returns it ('7', 'I-2', 'note-5', '4.02', 'ex-99.1'). Required when source is 'text'.",
      +  "maxLength": 40,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / citations / items / properties / source
      Added value: +{
      +  "description": "Where the figure was read: 'fact' (a Valuein fact_id/derived_id), 'text' (quoted from filing text; needs `section`), 'insider' (a Form 3/4/5 row) or 'holdings' (a 13F row, or an issuer aggregate named by `period_end`). `accession_ids[0]` names the filing for text/insider/holdings.",
      +  "enum": [
      +    "fact",
      +    "text",
      +    "insider",
      +    "holdings"
      +  ],
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / citations / description
      Previous value: -"Lineage you already hold for the figures in `markdown` — pass it rather than dropping it. Each claim should quote the figure exactly as the prose writes it, so figure review can link the two. Persisted as-is and NOT verified here; sign-off re-resolves every fact_id before certifying."New value: +"Lineage you already hold for the figures in `markdown` — pass it rather than dropping it. Each claim should quote the figure exactly as the prose writes it, so figure review can link the two. Every `fact_ids` entry must be a whole id copied exactly as a tool returned it (a 64-hex fact_id or a `drv1:` derived id): a truncated or annotated id rejects the call and nothing is saved. Ids are shape-checked only, NOT resolved here; sign-off re-resolves every fact_id before certifying."
  3. Changed1 schema field changed
    • changedOutput schema / properties / _meta / properties / cost_usd / properties / basis / description
      Previous value: -"payg_charge = real charge (agent-pay or your balance). payg_rate_card = indicative price, not billed."New value: +"payg_charge = real pay-per-call charge (a card or MPP payment through agent-pay). payg_rate_card = indicative price, not billed."
  4. Changed2 schema fields changed
    • changedOutput schema / properties / _meta / properties / cost_usd / properties / basis / description
      Previous value: -"payg_charge = real agent-pay charge. payg_rate_card = indicative price, not billed."New value: +"payg_charge = real charge (agent-pay or your balance). payg_rate_card = indicative price, not billed."
    • changedOutput schema / properties / _meta / properties / cost_usd / properties / billed / description
      Previous value: -"true = this amount was actually charged via PAYG for this call. false = indicative PAYG-equivalent value; your plan already covers this call for free."New value: +"true = this amount was actually charged via PAYG for this call. false = indicative PAYG-equivalent value only: no charge was made for this call (it was within your plan)."
  5. Changed2 schema fields changed
    • changedInput schema / properties / citations / items / properties / fact_ids / description
      Previous value: -"Valuein fact_ids backing the claim, as returned by the data tools."New value: +"Valuein fact_ids (or `drv1:` derived ids) backing the claim, exactly as the data tools returned them."
    • changedInput schema / properties / citations / items / properties / fact_ids / items / maxLength
      Previous value: -128New value: +1024
  6. Added
  7. Removed
  8. 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."
  9. Changed1 schema field changed
    • addedInput schema / properties / citations
      Added value: +{
      +  "description": "Lineage you already hold for the figures in `markdown` — pass it rather than dropping it. Each claim should quote the figure exactly as the prose writes it, so figure review can link the two. Persisted as-is and NOT verified here; sign-off re-resolves every fact_id before certifying.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "accession_ids": {
      +        "description": "Optional SEC accession ids backing the claim.",
      +        "items": {
      +          "maxLength": 32,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "claim": {
      +        "description": "Plain-English claim, quoting the figure as the prose writes it (e.g. 'FY2024 revenue: $391.0B').",
      +        "maxLength": 500,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "evidence": {
      +        "description": "Provenance class. Defaults to 'derived' — the weaker claim.",
      +        "enum": [
      +          "primary",
      +          "derived",
      +          "external"
      +        ],
      +        "type": "string"
      +      },
      +      "fact_ids": {
      +        "description": "Valuein fact_ids backing the claim, as returned by the data tools.",
      +        "items": {
      +          "maxLength": 128,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "filed_at": {
      +        "description": "SEC acceptance timestamp of the filing (ISO 8601) — when the figure became public.",
      +        "maxLength": 40,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "form_type": {
      +        "description": "SEC form the figure was reported on ('10-K', '10-Q', '20-F'), verbatim from the source.",
      +        "maxLength": 20,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "period_end": {
      +        "description": "Last day of the period the figure COVERS (YYYY-MM-DD). Not the filing date.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "period_label": {
      +        "description": "How the filer names that period: 'FY2025', 'Q3 2025'.",
      +        "maxLength": 40,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "sec_urls": {
      +        "description": "Optional EDGAR URLs, one per accession.",
      +        "items": {
      +          "maxLength": 500,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "ticker": {
      +        "description": "Ticker the fact belongs to. Lets a figure be verified when the report has no ticker.",
      +        "maxLength": 10,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "claim",
      +      "fact_ids"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 1000,
      +  "type": "array"
      +}
  10. 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"
      +}
  11. 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"
      +}
  12. Added

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantive behavior beyond the annotations: the output lands in DRAFT state and is later refined/exported, markdown headings are split into sections, missing citations block sign-off, and the idempotency key maps to a stable report id. The sign-off gating in particular is a non-obvious downstream consequence an agent cannot infer from readOnlyHint/destructiveHint/idempotentHint alone.

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 core action and the sibling contrast, and most sentences carry load-bearing information. The tail fragments ('Tier: sample rejected (reports are per-author state). Idempotency-key → stable report id.') are compressed internal shorthand that cost a little readability, and the all-caps 'PASS `citations`' is stylistically loud.

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

Completeness4/5

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

With an output schema present and 100% parameter coverage, the description need not explain return values, and it does supply the workflow context that matters: draft state, section splitting, citation/lineage requirements, and idempotency. The lifecycle after saving (sign-off, publish_report) is only gestured at via 'can never be signed off', leaving the next step implicit.

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 above that by singling out `citations` as the parameter that must be passed with real fact_ids and explaining the penalty for not doing so. It restates the whole-id requirement rather than adding to it, and says nothing extra about `ticker`/`abstract`/`idempotency_key` beyond the schema, so it stops short of 5.

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 ('Save free-form markdown ... as a DRAFT report') and immediately bounds the scope with the downstream affordances (refine in editor, export to Word/PDF). It explicitly contrasts itself with the sibling `create_report`, so an agent can distinguish the two without opening either schema.

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?

Names the alternative and the condition that selects it: use this for raw markdown, `create_report` for computed reverse_dcf/thesis reports. It also states the consequence of omitting citations (numbers read as unsourced, no sign-off), which is a real usage rule. It does not address the update-vs-create boundary (e.g. `update_report`) or draft-to-publish sequencing, so not a full 5.

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.