Skip to main content
Glama

Valuein — SEC EDGAR Fundamentals & Smart-Money Data

Verify Report Figures

verify_report_figures
Read-onlyIdempotent

Check EVERY number in one of your own reports against the filing it cites, in one call. Returns a verdict per figure: matches (the prose quotes the filing's own rendered string), differs (positive evidence the filing says something else — the report is wrong), or not_checkable (no comparison was possible). CALL THIS BEFORE publish_report OR sign_off_report. publish_report REFUSES a report carrying an unreviewed differs, so running this first is how you find out what to fix instead of being refused. TO FIX A differs: rewrite the figure by quoting verdict.display character-for-character (or verdict.derived_quarterly_display if you meant the quarter rather than the year-to-date number) with update_report, then call this again. A non-empty verdict.scope means the citation points at the WRONG FILING — re-quoting will not fix that; correct the citation. If the report's number is right and the comparison is not (an external source, a deliberate restatement), record a human disposition with save_figure_review — a reviewed figure no longer blocks publishing. ⚠️ not_checkable IS NOT A PASS AND IS NOT A RETRY. It means nobody compared anything — a figure with no fact, a fact with no rendered string, a lookup that failed. Report it as unverified; do not call the tool again expecting a different answer, and never present it as verified. Expect it to be a large share of any real report. untraced is counted separately from not_checkable on purpose: a figure that never had a source is a different finding from one whose source could not be read. statements lists sentences in the prose that contradict the report's own cited figures: for each entry with reviewed not true, rewrite the sentence with update_report so it agrees with the figures, or remove it; NEVER change a figure to make a sentence true; a reviewer's decision (reviewed: true) is final. statements: null means this server did not check statements, not that none were found. Nothing here is stored — a verdict is recomputed every call, because a later filing can restate a number and an edit changes a figure's identity. Only the report's author can verify it; a report that is not yours is indistinguishable from one that does not exist. Tier: sp500+ (sample rejected). Free — provenance calls are never charged.

Input Schema

NameRequiredDescriptionDefault
report_idYesIdentifier of the report to verify, as returned by create_report / list_my_reports / save_freeform_report. Must be authored by the calling customer.

Output Schema

NameRequiredDescriptionDefault
_metaYesProvenance envelope — data lineage for every MCP response
figuresYesOne entry per distinct figure in the report's prose. An empty array means the report states no numbers.
lineageYesEvery lineage that resolved, keyed by fact_id — the filing behind each figure, so you can cite it without a second call. A fact that did NOT resolve is absent; its figure's verdict already says why.
summaryYes
versionYesThe report version verified. Null when unrecorded — a version we could not read is not version zero.
coverageYes
report_idYesThe report these verdicts describe.
statementsYesSentences in the report's prose that contradict the report's own verified figures. NULL means this server did NOT check statements (an older deployment) - never read it as none found. An empty array means checked, none found. Each entry with `reviewed` not true is a sentence that contradicts the report's own cited figures: rewrite it with `update_report` so it agrees with them, or remove it. Never change a figure to make a sentence true. A reviewer's decision (`reviewed: true`) is final.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / statements
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "key": {
      +            "description": "Stable identity of this finding (`logic:<hash>`).",
      +            "type": "string"
      +          },
      +          "reviewed": {
      +            "description": "True when a reviewer already decided on it: that decision is FINAL. Null when this server did not say.",
      +            "type": [
      +              "boolean",
      +              "null"
      +            ]
      +          },
      +          "rule": {
      +            "description": "Which check fired: `direction`, `same_metric`, `superlative` or `period`.",
      +            "type": "string"
      +          },
      +          "section_id": {
      +            "description": "The report section the sentence is in.",
      +            "type": "string"
      +          },
      +          "sentence": {
      +            "description": "The sentence exactly as the report writes it — the text to rewrite or remove.",
      +            "type": "string"
      +          },
      +          "why": {
      +            "description": "Why it contradicts the report's own cited figures.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "key",
      +          "rule",
      +          "section_id",
      +          "sentence",
      +          "why",
      +          "reviewed"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Sentences in the report's prose that contradict the report's own verified figures. NULL means this server did NOT check statements (an older deployment) - never read it as none found. An empty array means checked, none found. Each entry with `reviewed` not true is a sentence that contradicts the report's own cited figures: rewrite it with `update_report` so it agrees with them, or remove it. Never change a figure to make a sentence true. A reviewer's decision (`reviewed: true`) is final."
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "_meta",
      -  "report_id",
      -  "version",
      -  "figures",
      -  "coverage",
      -  "summary",
      -  "lineage"
      -]New value: +[
      +  "_meta",
      +  "report_id",
      +  "version",
      +  "figures",
      +  "coverage",
      +  "summary",
      +  "lineage",
      +  "statements"
      +]
  2. 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."
  3. 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)."
  4. Added
  5. Removed
  6. 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."
  7. Added

TDQS

A4.8/5.0
Behavior5/5

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

Goes well past the readOnly/idempotent annotations: it discloses that nothing is stored and verdicts are recomputed each call, that auth is limited to the report's author, that tier gates access, and that the call is free. The `not_checkable` versus `untraced` distinction and the 'null statements means not checked' caveat are exactly the kind of behavioral nuance 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?

The action and the pre-publish gating are front-loaded, and each subsequent clause is operationally load-bearing (verdict semantics, fix path, not_checkable warning, statements handling). It is dense and heavy on ALL-CAPS/emoji emphasis, and the verdict-type explanations duplicate what the output schema likely encodes, so it is not maximally tight.

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 one-parameter read tool with an output schema, this is complete: it explains the verdict taxonomy, the statements block, the scope semantics, and the workflow around publish/sign-off. An agent has everything needed to call it once and act correctly on every result branch.

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% and the single `report_id` is already documented, so the baseline is 3; the description adds marginal value by reinforcing ownership ('one of your own reports' / 'Only the report's author can verify it'), which clarifies why a foreign ID behaves like a missing one. No further format or provenance detail is added.

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 opening sentence names a specific verb+resource+scope: checking every number in one of the caller's own reports against the filing it cites. It also implicitly separates itself from verify_facts/verify_filing_figures by anchoring on 'your own report' and 'the filing it cites', and the later line 'Only the report's author can verify it' cements the scope.

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?

Gives explicit sequencing ('CALL THIS BEFORE `publish_report` OR `sign_off_report`') and explains the consequence of skipping it (publish refuses an unreviewed `differs`). It then routes each outcome to a concrete next tool: rewrite via `update_report`, fix citation when `verdict.scope` is non-empty, or record a human disposition with `save_figure_review`.

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.