Skip to main content
Glama

Create a client-ready report (XLSX, PDF, ICS)

report_create

Hosted FactLot tool (api.factlot.com only). Builds a client-ready document by code, with no model: tx_unequal_appraisal (calc_tx_unequal_appraisal: evidence packet PDF or adjustment-grid workbook with live formulas; send registry_tx_equity_candidates' sources as context.sources to print each cited source's as-of date, URL and rights), lease_abstract (doc_abstract_lease), cam_reconciliation (calc_cam_reconciliation or _batch), debt_sizing (calc_debt_sizing), asc842_schedule (calc_lease_remeasurement_asc842), compare_proposals (calc_compare_proposals), dcf_summary (calc_dcf_pro_forma), critical_dates (calc_critical_dates; also ics: a calendar with each notice window and deadline dated on its contractual day and a reminder 30 days before; dates before today are left out unless include_past is true), tx_protest_deadline (rules_tx_property_tax_protest_deadline on tax_year, notice_delivered_date?, as_of?, or the _batch rule when arguments has items: ics, one calendar with each notice's statutory filing deadline and conservative file-by date as all-day events, reminders 30 and 7 days before the file-by date, the rule's basis, status, warnings and notes in each description, and the rule's next_season dates when the requested year has passed; or pdf, a deadline sheet). Every kind but lease_abstract requires the tool's arguments: FactLot runs the tool on them and builds the document from that run only, so its numbers are FactLot's results; a result sent as input is not used (the answer's result_mismatch says whether it differs). lease_abstract takes doc_abstract_lease's arguments, or its result as input: built from a supplied result, every page says the abstract values are as supplied by the caller and FactLot did not recompute them. Caller text (title, prepared_for, citation locators, comparable ids, labels and reasons, tx_protest_deadline item ids) is printed as supplied by the caller; advice or valuation wording in it is refused (TextNotAllowed). One report per request (one report_create per MCP batch). Returns download_url (works 24 hours), expires_at, bytes, sha256, filename and billed (true when this request counted against the month; every refusal has billed: false); inline: true also returns files under 1 MiB as base64. Counts against reports_per_month (free: 3 a month per IP address; Pro 50; Team 1,000); input errors are free.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "kind": "<kind>",
      "format": "<format>"
    },
    "name": "report_create"
  }
}

Input Schema

NameRequiredDescriptionDefault
kindYesWhich report.
inputNolease_abstract only: the doc_abstract_lease result, used when arguments are not sent (each page then says the values are the caller's). For other kinds a result sent here is not used; the answer says whether it matches FactLot's run (result_mismatch).
formatYesxlsx, pdf, or ics (critical_dates and tx_protest_deadline). tx_protest_deadline comes as ics or pdf.
inlineNoAlso return the file as base64 (an embedded resource) when it is under 1 MiB.
contextNoOptional title, prepared-for line, and citations (text only).
argumentsNoThe tool's arguments. Required for every kind but lease_abstract: FactLot runs the tool on them and builds the document from that run only. tx_protest_deadline: rules_tx_property_tax_protest_deadline's (tax_year, notice_delivered_date?, as_of?), or with items the _batch rule's (items: [{id, tax_year, notice_delivered_date?}], as_of?).
include_pastNoics only: also put dates before today in the calendar (critical_dates: today in UTC; tx_protest_deadline: today in US Central time, and the passed tax year's dates beside next season's). By default they are left out.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / arguments / description
      Previous value: -"The tool's arguments. Required for every kind but lease_abstract: FactLot runs the tool on them and builds the document from that run only."New value: +"The tool's arguments. Required for every kind but lease_abstract: FactLot runs the tool on them and builds the document from that run only. tx_protest_deadline: rules_tx_property_tax_protest_deadline's (tax_year, notice_delivered_date?, as_of?), or with items the _batch rule's (items: [{id, tax_year, notice_delivered_date?}], as_of?)."
    • addedInput schema / properties / context / properties / sources
      Added value: +{
      +  "description": "tx_unequal_appraisal: the `sources` of registry_tx_equity_candidates (or registry_get) as returned: each cited document_id with its title, uri, as_of and rights (ai_use, redistribution, license, attribution). The packet's Sources and rights block prints each cited source with its as-of date, URL and rights; a source sent without rights, or a right of \"unknown\", is printed as not stated by the publisher.",
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "as_of": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "document_id": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "retrieved_at": {
      +        "anyOf": [
      +          {
      +            "maxLength": 40,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "rights": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": {},
      +            "properties": {
      +              "ai_use": {
      +                "anyOf": [
      +                  {
      +                    "maxLength": 64,
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "attribution": {
      +                "anyOf": [
      +                  {
      +                    "maxLength": 300,
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "license": {
      +                "anyOf": [
      +                  {
      +                    "maxLength": 300,
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "redistribution": {
      +                "anyOf": [
      +                  {
      +                    "maxLength": 64,
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "source_id": {
      +        "anyOf": [
      +          {
      +            "maxLength": 300,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "title": {
      +        "anyOf": [
      +          {
      +            "maxLength": 300,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "uri": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "pattern": "^https?:\\/\\/\\S+$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "document_id"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 200,
      +  "type": "array"
      +}
    • changedInput schema / properties / format / description
      Previous value: -"xlsx, pdf, or ics (critical_dates only)."New value: +"xlsx, pdf, or ics (critical_dates and tx_protest_deadline). tx_protest_deadline comes as ics or pdf."
    • addedInput schema / properties / include_past
      Added value: +{
      +  "description": "ics only: also put dates before today in the calendar (critical_dates: today in UTC; tx_protest_deadline: today in US Central time, and the passed tax year's dates beside next season's). By default they are left out.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "tx_unequal_appraisal",
      -  "lease_abstract",
      -  "cam_reconciliation",
      -  "debt_sizing",
      -  "asc842_schedule",
      -  "compare_proposals",
      -  "dcf_summary",
      -  "critical_dates"
      -]New value: +[
      +  "tx_unequal_appraisal",
      +  "lease_abstract",
      +  "cam_reconciliation",
      +  "debt_sizing",
      +  "asc842_schedule",
      +  "compare_proposals",
      +  "dcf_summary",
      +  "critical_dates",
      +  "tx_protest_deadline"
      +]
  2. Added

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare a non-read-only, non-idempotent, non-destructive operation; the description goes far beyond that with billing semantics (billed true/false, refusals and input errors free), quotas by tier and IP, a 24-hour download_url expiry, and TextNotAllowed refusal on advice/valuation wording. It also discloses the provenance caveat that a caller-supplied lease_abstract result is printed as "as supplied by the caller" and not recomputed — information nowhere in 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the kind→tool mapping are front-loaded, but the body is one enormous semicolon-chained block in which quotas, ICS reminder offsets, and rights-printing rules are interleaved. Every fact is arguably useful, yet the density makes it hard to scan, and the "required for every kind but lease_abstract" rule is stated twice (description and arguments schema).

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 7-parameter, 9-kind, deeply nested tool with no output schema, the description supplies everything an agent needs: return fields (download_url, expires_at, bytes, sha256, filename, billed, inline base64), failure modes, quota cost, and the caller-text refusal rule. Nothing material about correct invocation is missing.

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

Parameters5/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, but the description adds real meaning the schema cannot: which kind consumes which sibling tool's arguments, the two tx_protest_deadline argument shapes (single vs _batch items), the context.sources requirement for tx_unequal_appraisal, and the timezone distinction for include_past (UTC vs US Central). This is meaning beyond, not restatement of, the JSON 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?

Opens with a specific verb + resource ("Builds a client-ready document by code, with no model") and then enumerates the exact nine kinds, mapping each to the calc/doc tool whose output it renders. An agent can distinguish this from every calc_* and doc_* sibling without opening a schema: those compute, this one produces a downloadable artifact.

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?

Clearly routes the agent: pass the underlying tool's arguments and FactLot runs it, and explicitly warns that "a result sent as input is not used" except for lease_abstract — a genuine when-not statement. It also constrains batching ("one report_create per MCP batch"). It never states the positive case for making a report at all versus just returning numbers from a calc tool, so full 5 is not earned.

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.