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

TableJSON 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. Persisted as-is and NOT verified 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

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

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. 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"
      +}
  3. 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"
      +}
  4. 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"
      +}
  5. Added

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, idempotentHint=true), the description discloses the draft-lifecycle, markdown splitting into sections, citations being persisted as-is and NOT verified at save time, and idempotency-key yielding a stable report id. It adds meaningful operational context rather than contradicting the annotations.

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 compact and front-loaded with the purpose and primary alternative. However, the sentence 'Tier: sample rejected (reports are per-author state)' is cryptic and does not clearly earn its place alongside the other purposeful sentences.

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?

It covers the main workflow, the key alternative, citations requirements, and idempotency behavior, which is strong for a create-style tool. The main gap is that no output schema is given and the description only implies the return value via the idempotency-key statement, without spelling out the full response shape.

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

Parameters3/5

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

The input schema already documents every parameter in detail, including the citations lineage structure and the markdown heading-to-section behavior, so schema coverage is high. The description contributes mainly emphasis and a sign-off consequence for citations rather than new field-level semantics, which fits the baseline of 3 for a fully-covered schema.

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 (Save), a specific resource (free-form markdown), and the produced state (DRAFT report), and explicitly distinguishes itself from create_report by contrasting raw markdown with computed structured reports. It also conveys downstream use (refine in editor, export to Word/PDF), so an agent can readily identify what this tool does.

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?

It explicitly names create_report as the alternative and gives the deciding condition: use save_freeform_report for raw markdown such as a chat synthesis, not for structured reverse_dcf or thesis reports. It also states a hard prerequisite for eventual sign-off: pass citations with fact_ids, otherwise figures read as unsourced.

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.