Skip to main content
Glama

Run a report

run_report
Read-onlyIdempotent

[Reports] Run a report and return each block's rows (aggregated numbers, at most 500 rows per block). Three ways: report_id of a saved custom report (your saved filters, then filters, apply; with version a newer report is refused with 409); report_id builtin: of a built-in report from list_reports (section, from / to, position_id or interview_id, limit / offset; sections that list candidates by name run only with include_candidates=true and are audited); or an unsaved definition, which is validated against list_report_fields and run without storing anything: this validates a definition without saving it: a wrong block comes back with ok=false and an error naming the field and the valid ids. Report numbers are decision-support material for a human reviewer. Block types: line needs a date dimension first (with a grain), kpi and funnel take no dimensions. The period filters each dataset on its own date (its description in list_report_fields says which; a snapshot dataset ignores it); left out, the last 30 days.

Every argument in full, with examples: get_tool_reference.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "run_report"
  }
}

Input Schema

NameRequiredDescriptionDefault
toNoBuilt-in reports only: last day of the period (YYYY-MM-DD, UTC, inclusive). Default: today. At most 400 days after `from`.
fromNoBuilt-in reports only: first day of the period (YYYY-MM-DD, UTC, inclusive). Default: 30 days before `to` (90 for fairness).
limitNoBuilt-in reports only: rows per section (1 to 500). Default 50, or 20 for a section of large rows (ATS jobs).
stageNobuiltin:fairness_monitoring only: pre_screening, ai_interview (default) or final.
offsetNoBuilt-in reports only: rows to skip in each section (default 0); see each block's pagination.
filtersNoApplied on top of definition.filters (custom reports only).
sectionNoBuilt-in reports only: run only this section (ids in list_reports). Default: every section.
versionNoWith a custom report_id: the version you read; a newer one is refused with 409.
block_idNoRun only this block (custom reports only; built-in reports take section).
llm_modelNoYour model id, e.g. "claude-opus-4-8"; "unknown" if unsure. For analytics.
report_idNoInstead of definition: run a saved custom report (its uuid; your saved filters, then filters, apply) or a built-in report id (builtin:<name>, from list_reports scope builtin).
definitionNoA custom report: report-wide filters and up to 12 blocks.
merchant_idNoOptional merchant to act on. Admins and sub-merchant operators only; other callers always use their token's merchant.
position_idNoBuilt-in reports only: one position (a position `id` from list_interviews), for the sections that take it (filters in list_reports).
interview_idNoBuilt-in reports only: one interview (an interview `id` from list_interviews), for the sections that take it.
conversation_idNoThe conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics.
include_candidatesNoBuilt-in reports only: also run the sections that list candidates by name (candidates true in list_reports). Default false.

Output Schema

NameRequiredDescriptionDefault
kindNo
titleNo
blocksYes
filtersYes
versionNo
admin_urlNo
report_idNo
builtin_idNo
descriptionNo
_mcp_instructionsNoServer-issued metadata for this conversation.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedInput schema / properties / definition / description
      Added value: +"A custom report: report-wide filters and up to 12 blocks."
    • changedInput schema / properties / filters / allOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "include_test": {
      -        "type": "boolean"
      -      },
      -      "interview_ids": {
      -        "items": {
      -          "format": "uuid",
      -          "type": "string"
      -        },
      -        "maxItems": 200,
      -        "type": "array"
      -      },
      -      "period": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "last_7_days",
      -                  "last_30_days",
      -                  "last_90_days",
      -                  "this_month",
      -                  "last_month",
      -                  "this_quarter",
      -                  "last_quarter",
      -                  "this_year",
      -                  "last_year",
      -                  "all_time"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "preset"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "from": {
      -                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -                "type": "string"
      -              },
      -              "to": {
      -                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "from",
      -              "to"
      -            ],
      -            "type": "object"
      -          }
      -        ]
      -      },
      -      "position_ids": {
      -        "items": {
      -          "format": "uuid",
      -          "type": "string"
      -        },
      -        "maxItems": 200,
      -        "type": "array"
      -      },
      -      "without_position": {
      -        "type": "boolean"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "description": "Applied on top of definition.filters (custom reports only)."
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "Filters for every block of the report.",
      +    "properties": {
      +      "include_test": {
      +        "type": "boolean"
      +      },
      +      "interview_ids": {
      +        "items": {
      +          "format": "uuid",
      +          "type": "string"
      +        },
      +        "maxItems": 200,
      +        "type": "array"
      +      },
      +      "period": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "last_7_days",
      +                  "last_30_days",
      +                  "last_90_days",
      +                  "this_month",
      +                  "last_month",
      +                  "this_quarter",
      +                  "last_quarter",
      +                  "this_year",
      +                  "last_year",
      +                  "all_time"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "preset"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "from": {
      +                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +                "type": "string"
      +              },
      +              "to": {
      +                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "from",
      +              "to"
      +            ],
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "position_ids": {
      +        "items": {
      +          "format": "uuid",
      +          "type": "string"
      +        },
      +        "maxItems": 200,
      +        "type": "array"
      +      },
      +      "without_position": {
      +        "type": "boolean"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {}
      +]
    • addedInput schema / properties / filters / description
      Added value: +"Applied on top of definition.filters (custom reports only)."
    • changedInput schema / properties / interview_id / description
      Previous value: -"Built-in reports only: one interview (interview_def_set.id), for the sections that take it."New value: +"Built-in reports only: one interview (an interview `id` from list_interviews), for the sections that take it."
    • changedInput schema / properties / position_id / description
      Previous value: -"Built-in reports only: one position (position_def_set.id), for the sections that take it (filters in list_reports)."New value: +"Built-in reports only: one position (a position `id` from list_interviews), for the sections that take it (filters in list_reports)."
  2. Changed46 schema fields changed
    • removedInput schema / properties / definition / description
      Removed value: -"The report to check and run. Required unless report_id is sent."
    • removedInput schema / properties / definition / example
      Removed value: -{
      -  "blocks": [
      -    {
      -      "compare": "previous_period",
      -      "dataset": "interview_results",
      -      "id": "headline",
      -      "measures": [
      -        "completed",
      -        "avg_score",
      -        "shortlisted"
      -      ],
      -      "type": "kpi"
      -    },
      -    {
      -      "dataset": "interview_results",
      -      "dimensions": [
      -        {
      -          "field": "date",
      -          "grain": "week"
      -        }
      -      ],
      -      "id": "trend",
      -      "measures": [
      -        "completed"
      -      ],
      -      "title": "Completed per week",
      -      "type": "line",
      -      "width": 8
      -    },
      -    {
      -      "dataset": "interview_results",
      -      "dimensions": [
      -        "position"
      -      ],
      -      "id": "by_position",
      -      "limit": 25,
      -      "measures": [
      -        "completed",
      -        "avg_score",
      -        "shortlisted"
      -      ],
      -      "sort": [
      -        {
      -          "dir": "desc",
      -          "field": "completed"
      -        }
      -      ],
      -      "title": "By position",
      -      "type": "table"
      -    }
      -  ],
      -  "filters": {
      -    "period": {
      -      "preset": "last_30_days"
      -    }
      -  },
      -  "schema": "jobmojito.report/v1",
      -  "title": "Weekly hiring pulse"
      -}
    • removedInput schema / properties / definition / properties / blocks / items / properties / compare / description
      Removed value: -"kpi / funnel only: also return the same numbers for the period before."
    • removedInput schema / properties / definition / properties / blocks / items / properties / dataset / description
      Removed value: -"Dataset id from report-catalog. Not used by a text block."
    • removedInput schema / properties / definition / properties / blocks / items / properties / dataset / example
      Removed value: -"interview_results"
    • changedInput schema / properties / definition / properties / blocks / items / properties / dimensions / items / anyOf
      Previous value: -[
      -  {
      -    "pattern": "^[a-z][a-z0-9_]{0,40}$",
      -    "type": "string"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "field": {
      -        "pattern": "^[a-z][a-z0-9_]{0,40}$",
      -        "type": "string"
      -      },
      -      "grain": {
      -        "description": "For a date field: day (default), week, month, quarter or year.",
      -        "enum": [
      -          "day",
      -          "week",
      -          "month",
      -          "quarter",
      -          "year"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "field"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "pattern": "^[a-z][a-z0-9_]{0,40}$",
      +    "type": "string"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "field": {
      +        "pattern": "^[a-z][a-z0-9_]{0,40}$",
      +        "type": "string"
      +      },
      +      "grain": {
      +        "enum": [
      +          "day",
      +          "week",
      +          "month",
      +          "quarter",
      +          "year"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "field"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / definition / properties / blocks / items / properties / dimensions / items / description
      Removed value: -"A dimension field id, or {\"field\", \"grain\"} for a date."
    • removedInput schema / properties / definition / properties / blocks / items / properties / id / example
      Removed value: -"by_position"
    • removedInput schema / properties / definition / properties / blocks / items / properties / limit / description
      Removed value: -"Rows for a table / bar / line. Default 100 (line 500)."
    • removedInput schema / properties / definition / properties / blocks / items / properties / measures / description
      Removed value: -"1 to 6 measure ids of the dataset."
    • removedInput schema / properties / definition / properties / blocks / items / properties / measures / example
      Removed value: -[
      -  "completed",
      -  "avg_score"
      -]
    • removedInput schema / properties / definition / properties / blocks / items / properties / sort / items / properties / field / description
      Removed value: -"A dimension or measure the block selects."
    • removedInput schema / properties / definition / properties / blocks / items / properties / text / description
      Removed value: -"Text block only: the note (plain text, line breaks kept)."
    • removedInput schema / properties / definition / properties / blocks / items / properties / type / description
      Removed value: -"kpi: one total per measure (no dimensions; add compare previous_period for a change). funnel: 2+ measures as steps (no dimensions). table: 0-2 dimensions. bar: 1-2 dimensions. stacked_bar: exactly 2 dimensions. line: first dimension a date. text: a note, only `text`."
    • removedInput schema / properties / definition / properties / blocks / items / properties / where / items / properties / field / description
      Removed value: -"A dimension of the block's dataset."
    • removedInput schema / properties / definition / properties / blocks / items / properties / where / items / properties / value / description
      Removed value: -"One value for eq / neq / gt / gte / lt / lte, a list for in / not_in, [low, high] for between, nothing for is_empty / is_not_empty."
    • removedInput schema / properties / definition / properties / blocks / items / properties / width / description
      Removed value: -"Columns of a 12-column grid. Default 12."
    • removedInput schema / properties / definition / properties / filters / description
      Removed value: -"Filters for every block of the report. Each viewer can override them for themselves."
    • removedInput schema / properties / definition / properties / filters / properties / include_test / description
      Removed value: -"Include test runs. Default false."
    • removedInput schema / properties / definition / properties / filters / properties / interview_ids / description
      Removed value: -"Interviews to show (interview ids from list_interviews), combined with the other picks by OR. Nothing picked = all."
    • removedInput schema / properties / definition / properties / filters / properties / period / description
      Removed value: -"Either a preset, or from and to dates (YYYY-MM-DD, both inclusive, UTC). Default: last_30_days."
    • removedInput schema / properties / definition / properties / filters / properties / period / example
      Removed value: -{
      -  "preset": "last_30_days"
      -}
    • removedInput schema / properties / definition / properties / filters / properties / position_ids / description
      Removed value: -"Positions to show (position ids from list_interviews). position_ids, interview_ids and without_position are one pick list: a row shows when it belongs to ANY pick. Nothing picked = all."
    • removedInput schema / properties / definition / properties / filters / properties / without_position / description
      Removed value: -"Also pick interviews that are not part of any position (stand-alone interviews, and coaching sessions). Combined with the other picks by OR."
    • removedInput schema / properties / definition / properties / schema / description
      Removed value: -"Always \"jobmojito.report/v1\"."
    • changedInput schema / properties / filters / allOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "Filters for every block of the report. Each viewer can override them for themselves.",
      -    "properties": {
      -      "include_test": {
      -        "description": "Include test runs. Default false.",
      -        "type": "boolean"
      -      },
      -      "interview_ids": {
      -        "description": "Interviews to show (interview ids from list_interviews), combined with the other picks by OR. Nothing picked = all.",
      -        "items": {
      -          "format": "uuid",
      -          "type": "string"
      -        },
      -        "maxItems": 200,
      -        "type": "array"
      -      },
      -      "period": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "last_7_days",
      -                  "last_30_days",
      -                  "last_90_days",
      -                  "this_month",
      -                  "last_month",
      -                  "this_quarter",
      -                  "last_quarter",
      -                  "this_year",
      -                  "last_year",
      -                  "all_time"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "preset"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "from": {
      -                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -                "type": "string"
      -              },
      -              "to": {
      -                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "from",
      -              "to"
      -            ],
      -            "type": "object"
      -          }
      -        ],
      -        "description": "Either a preset, or from and to dates (YYYY-MM-DD, both inclusive, UTC). Default: last_30_days.",
      -        "example": {
      -          "preset": "last_30_days"
      -        }
      -      },
      -      "position_ids": {
      -        "description": "Positions to show (position ids from list_interviews). position_ids, interview_ids and without_position are one pick list: a row shows when it belongs to ANY pick. Nothing picked = all.",
      -        "items": {
      -          "format": "uuid",
      -          "type": "string"
      -        },
      -        "maxItems": 200,
      -        "type": "array"
      -      },
      -      "without_position": {
      -        "description": "Also pick interviews that are not part of any position (stand-alone interviews, and coaching sessions). Combined with the other picks by OR.",
      -        "type": "boolean"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "description": "Applied on top of definition.filters (custom reports only)."
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "include_test": {
      +        "type": "boolean"
      +      },
      +      "interview_ids": {
      +        "items": {
      +          "format": "uuid",
      +          "type": "string"
      +        },
      +        "maxItems": 200,
      +        "type": "array"
      +      },
      +      "period": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "last_7_days",
      +                  "last_30_days",
      +                  "last_90_days",
      +                  "this_month",
      +                  "last_month",
      +                  "this_quarter",
      +                  "last_quarter",
      +                  "this_year",
      +                  "last_year",
      +                  "all_time"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "preset"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "from": {
      +                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +                "type": "string"
      +              },
      +              "to": {
      +                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "from",
      +              "to"
      +            ],
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "position_ids": {
      +        "items": {
      +          "format": "uuid",
      +          "type": "string"
      +        },
      +        "maxItems": 200,
      +        "type": "array"
      +      },
      +      "without_position": {
      +        "type": "boolean"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "description": "Applied on top of definition.filters (custom reports only)."
      +  }
      +]
    • removedInput schema / properties / from / example
      Removed value: -"2026-10-01"
    • changedInput schema / properties / include_candidates / description
      Previous value: -"Built-in reports only: also run the sections that list candidates by name (candidates true in list_reports). Default false. Every such read is recorded in the audit log."New value: +"Built-in reports only: also run the sections that list candidates by name (candidates true in list_reports). Default false."
    • changedInput schema / properties / interview_id / description
      Previous value: -"Built-in reports only: one interview (interview_def_set.id), for the sections that take it. Not with position_id."New value: +"Built-in reports only: one interview (interview_def_set.id), for the sections that take it."
    • addedInput schema / properties / llm_model
      Added value: +{
      +  "description": "Your model id, e.g. \"claude-opus-4-8\"; \"unknown\" if unsure. For analytics.",
      +  "type": "string"
      +}
    • removedInput schema / properties / report_id / example
      Removed value: -"builtin:recruiter_workload"
    • removedInput schema / properties / section / example
      Removed value: -"positions"
    • removedInput schema / properties / to / example
      Removed value: -"2026-10-31"
    • removedOutput schema / properties / admin_url / description
      Removed value: -"Built-in reports: the report in the JobMojito admin."
    • removedOutput schema / properties / blocks / description
      Removed value: -"One result per block. A built-in report returns one per section: block_id is the section id, plus title, candidates (lists candidates by name), columns, rows and pagination {limit, offset, total (null when unknown), has_more}. A section that cannot run for you is ok=false with the reason."
    • removedOutput schema / properties / blocks / items / properties / columns / description
      Removed value: -"Each column: id, kind (dimension | measure), type, label, and for measures a format."
    • removedOutput schema / properties / blocks / items / properties / ok / description
      Removed value: -"false when this block could not run; see error. Other blocks are unaffected."
    • removedOutput schema / properties / blocks / items / properties / period / description
      Removed value: -"The period the block covered: from, to (inclusive), snapshot (true when the dataset ignores the period)."
    • removedOutput schema / properties / blocks / items / properties / previous / description
      Removed value: -"compare previous_period: the same measures for the period before."
    • removedOutput schema / properties / blocks / items / properties / rows / description
      Removed value: -"One object per row, keyed by column id."
    • removedOutput schema / properties / blocks / items / properties / truncated / description
      Removed value: -"More rows exist than the block limit."
    • removedOutput schema / properties / builtin_id / description
      Removed value: -"The built-in report that ran (instead of report_id)."
    • removedOutput schema / properties / description / description
      Removed value: -"Built-in reports: what the report shows."
    • removedOutput schema / properties / filters / description
      Removed value: -"The filters the blocks ran with (custom: report defaults, then your saved filters, then the ones you passed; built-in: period, position_id or interview_id, stage, include_candidates, limit, offset)."
    • removedOutput schema / properties / kind / description
      Removed value: -"builtin for a built-in report; absent for a custom report."
    • removedOutput schema / properties / report_id / description
      Removed value: -"The custom report that ran."
  3. Changed28 schema fields changed
    • changedInput schema / properties / block_id / description
      Previous value: -"Run only this block."New value: +"Run only this block (custom reports only; built-in reports take section)."
    • addedInput schema / properties / definition
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The report to check and run. Required unless report_id is sent.",
      +  "example": {
      +    "blocks": [
      +      {
      +        "compare": "previous_period",
      +        "dataset": "interview_results",
      +        "id": "headline",
      +        "measures": [
      +          "completed",
      +          "avg_score",
      +          "shortlisted"
      +        ],
      +        "type": "kpi"
      +      },
      +      {
      +        "dataset": "interview_results",
      +        "dimensions": [
      +          {
      +            "field": "date",
      +            "grain": "week"
      +          }
      +        ],
      +        "id": "trend",
      +        "measures": [
      +          "completed"
      +        ],
      +        "title": "Completed per week",
      +        "type": "line",
      +        "width": 8
      +      },
      +      {
      +        "dataset": "interview_results",
      +        "dimensions": [
      +          "position"
      +        ],
      +        "id": "by_position",
      +        "limit": 25,
      +        "measures": [
      +          "completed",
      +          "avg_score",
      +          "shortlisted"
      +        ],
      +        "sort": [
      +          {
      +            "dir": "desc",
      +            "field": "completed"
      +          }
      +        ],
      +        "title": "By position",
      +        "type": "table"
      +      }
      +    ],
      +    "filters": {
      +      "period": {
      +        "preset": "last_30_days"
      +      }
      +    },
      +    "schema": "jobmojito.report/v1",
      +    "title": "Weekly hiring pulse"
      +  },
      +  "properties": {
      +    "blocks": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "compare": {
      +            "description": "kpi / funnel only: also return the same numbers for the period before.",
      +            "enum": [
      +              "previous_period"
      +            ],
      +            "type": "string"
      +          },
      +          "dataset": {
      +            "description": "Dataset id from report-catalog. Not used by a text block.",
      +            "example": "interview_results",
      +            "type": "string"
      +          },
      +          "dimensions": {
      +            "items": {
      +              "anyOf": [
      +                {
      +                  "pattern": "^[a-z][a-z0-9_]{0,40}$",
      +                  "type": "string"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "field": {
      +                      "pattern": "^[a-z][a-z0-9_]{0,40}$",
      +                      "type": "string"
      +                    },
      +                    "grain": {
      +                      "description": "For a date field: day (default), week, month, quarter or year.",
      +                      "enum": [
      +                        "day",
      +                        "week",
      +                        "month",
      +                        "quarter",
      +                        "year"
      +                      ],
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "field"
      +                  ],
      +                  "type": "object"
      +                }
      +              ],
      +              "description": "A dimension field id, or {\"field\", \"grain\"} for a date."
      +            },
      +            "maxItems": 2,
      +            "type": "array"
      +          },
      +          "id": {
      +            "example": "by_position",
      +            "pattern": "^[A-Za-z0-9_-]{1,40}$",
      +            "type": "string"
      +          },
      +          "limit": {
      +            "description": "Rows for a table / bar / line. Default 100 (line 500).",
      +            "maximum": 500,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "measures": {
      +            "description": "1 to 6 measure ids of the dataset.",
      +            "example": [
      +              "completed",
      +              "avg_score"
      +            ],
      +            "items": {
      +              "pattern": "^[a-z][a-z0-9_]{0,40}$",
      +              "type": "string"
      +            },
      +            "maxItems": 6,
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "sort": {
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "dir": {
      +                  "enum": [
      +                    "asc",
      +                    "desc"
      +                  ],
      +                  "type": "string"
      +                },
      +                "field": {
      +                  "description": "A dimension or measure the block selects.",
      +                  "pattern": "^[a-z][a-z0-9_]{0,40}$",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "field"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 3,
      +            "type": "array"
      +          },
      +          "text": {
      +            "description": "Text block only: the note (plain text, line breaks kept).",
      +            "maxLength": 4000,
      +            "type": "string"
      +          },
      +          "title": {
      +            "maxLength": 120,
      +            "type": "string"
      +          },
      +          "type": {
      +            "description": "kpi: one total per measure (no dimensions; add compare previous_period for a change). funnel: 2+ measures as steps (no dimensions). table: 0-2 dimensions. bar: 1-2 dimensions. stacked_bar: exactly 2 dimensions. line: first dimension a date. text: a note, only `text`.",
      +            "enum": [
      +              "kpi",
      +              "table",
      +              "bar",
      +              "stacked_bar",
      +              "line",
      +              "funnel",
      +              "text"
      +            ],
      +            "type": "string"
      +          },
      +          "where": {
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "field": {
      +                  "description": "A dimension of the block's dataset.",
      +                  "pattern": "^[a-z][a-z0-9_]{0,40}$",
      +                  "type": "string"
      +                },
      +                "op": {
      +                  "enum": [
      +                    "eq",
      +                    "neq",
      +                    "in",
      +                    "not_in",
      +                    "gt",
      +                    "gte",
      +                    "lt",
      +                    "lte",
      +                    "between",
      +                    "is_empty",
      +                    "is_not_empty"
      +                  ],
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "anyOf": [
      +                    {
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "number"
      +                    },
      +                    {
      +                      "type": "boolean"
      +                    },
      +                    {
      +                      "items": {
      +                        "anyOf": [
      +                          {
      +                            "type": "string"
      +                          },
      +                          {
      +                            "type": "number"
      +                          }
      +                        ]
      +                      },
      +                      "type": "array"
      +                    }
      +                  ],
      +                  "description": "One value for eq / neq / gt / gte / lt / lte, a list for in / not_in, [low, high] for between, nothing for is_empty / is_not_empty."
      +                }
      +              },
      +              "required": [
      +                "field",
      +                "op"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 10,
      +            "type": "array"
      +          },
      +          "width": {
      +            "description": "Columns of a 12-column grid. Default 12.",
      +            "maximum": 12,
      +            "minimum": 1,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "type"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 12,
      +      "type": "array"
      +    },
      +    "description": {
      +      "maxLength": 1000,
      +      "type": "string"
      +    },
      +    "filters": {
      +      "additionalProperties": false,
      +      "description": "Filters for every block of the report. Each viewer can override them for themselves.",
      +      "properties": {
      +        "include_test": {
      +          "description": "Include test runs. Default false.",
      +          "type": "boolean"
      +        },
      +        "interview_ids": {
      +          "description": "Interviews to show (interview ids from list_interviews), combined with the other picks by OR. Nothing picked = all.",
      +          "items": {
      +            "format": "uuid",
      +            "type": "string"
      +          },
      +          "maxItems": 200,
      +          "type": "array"
      +        },
      +        "period": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": false,
      +              "properties": {
      +                "preset": {
      +                  "enum": [
      +                    "last_7_days",
      +                    "last_30_days",
      +                    "last_90_days",
      +                    "this_month",
      +                    "last_month",
      +                    "this_quarter",
      +                    "last_quarter",
      +                    "this_year",
      +                    "last_year",
      +                    "all_time"
      +                  ],
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "preset"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "additionalProperties": false,
      +              "properties": {
      +                "from": {
      +                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +                  "type": "string"
      +                },
      +                "to": {
      +                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "from",
      +                "to"
      +              ],
      +              "type": "object"
      +            }
      +          ],
      +          "description": "Either a preset, or from and to dates (YYYY-MM-DD, both inclusive, UTC). Default: last_30_days.",
      +          "example": {
      +            "preset": "last_30_days"
      +          }
      +        },
      +        "position_ids": {
      +          "description": "Positions to show (position ids from list_interviews). position_ids, interview_ids and without_position are one pick list: a row shows when it belongs to ANY pick. Nothing picked = all.",
      +          "items": {
      +            "format": "uuid",
      +            "type": "string"
      +          },
      +          "maxItems": 200,
      +          "type": "array"
      +        },
      +        "without_position": {
      +          "description": "Also pick interviews that are not part of any position (stand-alone interviews, and coaching sessions). Combined with the other picks by OR.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "schema": {
      +      "description": "Always \"jobmojito.report/v1\".",
      +      "enum": [
      +        "jobmojito.report/v1"
      +      ],
      +      "type": "string"
      +    },
      +    "title": {
      +      "maxLength": 120,
      +      "minLength": 1,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "schema",
      +    "title",
      +    "blocks"
      +  ],
      +  "type": "object"
      +}
    • removedInput schema / properties / draft
      Removed value: -{
      -  "default": "false",
      -  "description": "Run the unpublished draft instead (only if you can edit the report).",
      -  "enum": [
      -    "true",
      -    "false"
      -  ],
      -  "example": "false",
      -  "type": "string"
      -}
    • addedInput schema / properties / filters / allOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "Filters for every block of the report. Each viewer can override them for themselves.",
      +    "properties": {
      +      "include_test": {
      +        "description": "Include test runs. Default false.",
      +        "type": "boolean"
      +      },
      +      "interview_ids": {
      +        "description": "Interviews to show (interview ids from list_interviews), combined with the other picks by OR. Nothing picked = all.",
      +        "items": {
      +          "format": "uuid",
      +          "type": "string"
      +        },
      +        "maxItems": 200,
      +        "type": "array"
      +      },
      +      "period": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "last_7_days",
      +                  "last_30_days",
      +                  "last_90_days",
      +                  "this_month",
      +                  "last_month",
      +                  "this_quarter",
      +                  "last_quarter",
      +                  "this_year",
      +                  "last_year",
      +                  "all_time"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "preset"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "from": {
      +                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +                "type": "string"
      +              },
      +              "to": {
      +                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "from",
      +              "to"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "description": "Either a preset, or from and to dates (YYYY-MM-DD, both inclusive, UTC). Default: last_30_days.",
      +        "example": {
      +          "preset": "last_30_days"
      +        }
      +      },
      +      "position_ids": {
      +        "description": "Positions to show (position ids from list_interviews). position_ids, interview_ids and without_position are one pick list: a row shows when it belongs to ANY pick. Nothing picked = all.",
      +        "items": {
      +          "format": "uuid",
      +          "type": "string"
      +        },
      +        "maxItems": 200,
      +        "type": "array"
      +      },
      +      "without_position": {
      +        "description": "Also pick interviews that are not part of any position (stand-alone interviews, and coaching sessions). Combined with the other picks by OR.",
      +        "type": "boolean"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "description": "Applied on top of definition.filters (custom reports only)."
      +  }
      +]
    • removedInput schema / properties / filters / description
      Removed value: -"Optional JSON ReportFilters to apply on top, e.g. {\"period\":{\"preset\":\"last_month\"}}."
    • removedInput schema / properties / filters / type
      Removed value: -"string"
    • addedInput schema / properties / from
      Added value: +{
      +  "description": "Built-in reports only: first day of the period (YYYY-MM-DD, UTC, inclusive). Default: 30 days before `to` (90 for fairness).",
      +  "example": "2026-10-01",
      +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +  "type": "string"
      +}
    • removedInput schema / properties / id
      Removed value: -{
      -  "description": "Report id (from list_reports).",
      -  "format": "uuid",
      -  "type": "string"
      -}
    • addedInput schema / properties / include_candidates
      Added value: +{
      +  "description": "Built-in reports only: also run the sections that list candidates by name (candidates true in list_reports). Default false. Every such read is recorded in the audit log.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / interview_id
      Added value: +{
      +  "description": "Built-in reports only: one interview (interview_def_set.id), for the sections that take it. Not with position_id.",
      +  "format": "uuid",
      +  "type": "string"
      +}
    • addedInput schema / properties / limit
      Added value: +{
      +  "description": "Built-in reports only: rows per section (1 to 500). Default 50, or 20 for a section of large rows (ATS jobs).",
      +  "maximum": 500,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / properties / merchant_id / description
      Previous value: -"Optional merchant to scope to. Admins and sub-merchant operators only; other callers always use their token's merchant."New value: +"Optional merchant to act on. Admins and sub-merchant operators only; other callers always use their token's merchant."
    • removedInput schema / properties / merchant_id / example
      Removed value: -"28106cba-1c27-4e53-b149-32113e5e8e31"
    • addedInput schema / properties / offset
      Added value: +{
      +  "description": "Built-in reports only: rows to skip in each section (default 0); see each block's pagination.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / position_id
      Added value: +{
      +  "description": "Built-in reports only: one position (position_def_set.id), for the sections that take it (filters in list_reports).",
      +  "format": "uuid",
      +  "type": "string"
      +}
    • addedInput schema / properties / report_id
      Added value: +{
      +  "description": "Instead of definition: run a saved custom report (its uuid; your saved filters, then filters, apply) or a built-in report id (builtin:<name>, from list_reports scope builtin).",
      +  "example": "builtin:recruiter_workload",
      +  "type": "string"
      +}
    • addedInput schema / properties / section
      Added value: +{
      +  "description": "Built-in reports only: run only this section (ids in list_reports). Default: every section.",
      +  "example": "positions",
      +  "pattern": "^[a-z][a-z0-9_]{0,40}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / stage
      Added value: +{
      +  "description": "builtin:fairness_monitoring only: pre_screening, ai_interview (default) or final.",
      +  "enum": [
      +    "pre_screening",
      +    "ai_interview",
      +    "final"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / to
      Added value: +{
      +  "description": "Built-in reports only: last day of the period (YYYY-MM-DD, UTC, inclusive). Default: today. At most 400 days after `from`.",
      +  "example": "2026-10-31",
      +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / version
      Added value: +{
      +  "description": "With a custom report_id: the version you read; a newer one is refused with 409.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "id"
      -]New value: +[]
    • addedOutput schema / properties / admin_url
      Added value: +{
      +  "description": "Built-in reports: the report in the JobMojito admin.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / blocks / description
      Added value: +"One result per block. A built-in report returns one per section: block_id is the section id, plus title, candidates (lists candidates by name), columns, rows and pagination {limit, offset, total (null when unknown), has_more}. A section that cannot run for you is ok=false with the reason."
    • addedOutput schema / properties / builtin_id
      Added value: +{
      +  "description": "The built-in report that ran (instead of report_id).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / description
      Added value: +{
      +  "description": "Built-in reports: what the report shows.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / filters / description
      Previous value: -"The filters the blocks ran with (report defaults, then your saved filters, then the ones you passed)."New value: +"The filters the blocks ran with (custom: report defaults, then your saved filters, then the ones you passed; built-in: period, position_id or interview_id, stage, include_candidates, limit, offset)."
    • addedOutput schema / properties / kind
      Added value: +{
      +  "description": "builtin for a built-in report; absent for a custom report.",
      +  "enum": [
      +    "builtin",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / report_id / description
      Added value: +"The custom report that ran."
  4. Changed1 schema field changed
    • changedInput schema / properties / conversation_id / description
      Previous value: -"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."New value: +"The conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics."
  5. Added

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, and the description still adds substantial behavior: the 500-row block cap, the default last-30-days period with per-dataset date semantics and snapshot datasets ignoring it, the audit trail for candidate-name sections, ok=false with a field-naming error on invalid blocks, and the 409 on stale versions. That is well beyond what the annotations convey.

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-loads the action and return shape, then organizes details under an explicit 'Three ways:' frame that matches the argument structure. It is dense but appropriate for a 17-parameter tool; the only wasted text is the duplicated clause 'run without storing anything: this validates a definition without saving it'. The trailer pointing to get_tool_reference buys space rather than spending it.

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?

Given 17 parameters, nested definition objects and an existing output schema, the description covers what the schema cannot: mode selection, period defaults, block-type constraints (line needs a date dimension with a grain; kpi/funnel take none), error semantics, and auditing. Return-value explanation is rightly left to the output schema.

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 would be 3; the description adds cross-parameter meaning the schema cannot express — that `filters` apply on top of `definition.filters` for custom reports, that `block_id` is custom-only while `section` is builtin-only, and that `version` guards against a newer saved report. These are real interactions rather than restatements of property text.

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 and resource plus the return shape: run a report and return each block's rows (aggregated numbers, at most 500 rows per block). It then enumerates the three distinct invocation modes (saved custom `report_id`, `builtin:<name>` from list_reports, unsaved `definition`), which lets an agent distinguish this from siblings like save_report or get_report without opening the 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?

Gives explicit mode selection with prerequisites: builtin ids come from list_reports, definitions are validated against list_report_fields, unsaved definitions run without storing anything, and `version` triggers a 409 on drift. It also states section/position/interview scoping rules and the include_candidates audit condition. It does not explicitly contrast with get_report/save_report, so the alternative-routing is implied rather than fully stated.

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.