Skip to main content
Glama

Save a custom report

save_report
Destructive

[Reports] Without report_id: save a new custom report from a definition (schema jobmojito.report/v1); it is created as Only me and is shared from the returned admin_url. With report_id and the version from get_report: replace that report's whole definition; on a report shared with other people the change is saved as a draft that the owner publishes in the admin, a private report updates at once, whatever target says. run_report with a definition and no report_id validates one without saving it.

Every argument in full, with examples: get_tool_reference.

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": {
      "definition": "<definition>"
    },
    "name": "save_report"
  }
}

Input Schema

NameRequiredDescriptionDefault
targetNoWith report_id: published (default) or draft; through this server it has no effect: a private report always publishes and a shared one gets a draft.
versionNoWith report_id: the version you read (get_report / list_reports). A stale version is refused with 409.
llm_modelNoYour model id, e.g. "claude-opus-4-8"; "unknown" if unsure. For analytics.
report_idNoOptional: replace the definition of this saved report instead of creating one.
definitionYesA 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.
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.

Output Schema

NameRequiredDescriptionDefault
idYes
versionYes
admin_urlYes
publishedYes
_mcp_instructionsNoServer-issued metadata for this conversation.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / target / description
      Previous value: -"With report_id: published (default) or draft."New value: +"With report_id: published (default) or draft; through this server it has no effect: a private report always publishes and a shared one gets a draft."
  2. Changed7 schema fields changed
    • addedInput schema / properties / definition / additionalProperties
      Added value: +false
    • removedInput schema / properties / definition / allOf
      Removed value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "blocks": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "compare": {
      -              "enum": [
      -                "previous_period"
      -              ],
      -              "type": "string"
      -            },
      -            "dataset": {
      -              "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": {
      -                        "enum": [
      -                          "day",
      -                          "week",
      -                          "month",
      -                          "quarter",
      -                          "year"
      -                        ],
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "field"
      -                    ],
      -                    "type": "object"
      -                  }
      -                ]
      -              },
      -              "maxItems": 2,
      -              "type": "array"
      -            },
      -            "id": {
      -              "pattern": "^[A-Za-z0-9_-]{1,40}$",
      -              "type": "string"
      -            },
      -            "limit": {
      -              "maximum": 500,
      -              "minimum": 1,
      -              "type": "integer"
      -            },
      -            "measures": {
      -              "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": {
      -                    "pattern": "^[a-z][a-z0-9_]{0,40}$",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "field"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 3,
      -              "type": "array"
      -            },
      -            "text": {
      -              "maxLength": 4000,
      -              "type": "string"
      -            },
      -            "title": {
      -              "maxLength": 120,
      -              "type": "string"
      -            },
      -            "type": {
      -              "enum": [
      -                "kpi",
      -                "table",
      -                "bar",
      -                "stacked_bar",
      -                "line",
      -                "funnel",
      -                "text"
      -              ],
      -              "type": "string"
      -            },
      -            "where": {
      -              "items": {
      -                "additionalProperties": false,
      -                "properties": {
      -                  "field": {
      -                    "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"
      -                      }
      -                    ]
      -                  }
      -                },
      -                "required": [
      -                  "field",
      -                  "op"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 10,
      -              "type": "array"
      -            },
      -            "width": {
      -              "maximum": 12,
      -              "minimum": 1,
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "id",
      -            "type"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "type": "array"
      -      },
      -      "description": {
      -        "maxLength": 1000,
      -        "type": "string"
      -      },
      -      "filters": {
      -        "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"
      -      },
      -      "schema": {
      -        "enum": [
      -          "jobmojito.report/v1"
      -        ],
      -        "type": "string"
      -      },
      -      "title": {
      -        "maxLength": 120,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "schema",
      -      "title",
      -      "blocks"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "A custom report: report-wide filters and up to 12 blocks."
      -  }
      -]
    • addedInput schema / properties / definition / description
      Added value: +"A custom report: report-wide filters and up to 12 blocks."
    • addedInput schema / properties / definition / properties
      Added value: +{
      +  "blocks": {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "compare": {
      +          "enum": [
      +            "previous_period"
      +          ],
      +          "type": "string"
      +        },
      +        "dataset": {
      +          "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": {
      +                    "enum": [
      +                      "day",
      +                      "week",
      +                      "month",
      +                      "quarter",
      +                      "year"
      +                    ],
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "field"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          },
      +          "maxItems": 2,
      +          "type": "array"
      +        },
      +        "id": {
      +          "pattern": "^[A-Za-z0-9_-]{1,40}$",
      +          "type": "string"
      +        },
      +        "limit": {
      +          "maximum": 500,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "measures": {
      +          "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": {
      +                "pattern": "^[a-z][a-z0-9_]{0,40}$",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "field"
      +            ],
      +            "type": "object"
      +          },
      +          "maxItems": 3,
      +          "type": "array"
      +        },
      +        "text": {
      +          "maxLength": 4000,
      +          "type": "string"
      +        },
      +        "title": {
      +          "maxLength": 120,
      +          "type": "string"
      +        },
      +        "type": {
      +          "enum": [
      +            "kpi",
      +            "table",
      +            "bar",
      +            "stacked_bar",
      +            "line",
      +            "funnel",
      +            "text"
      +          ],
      +          "type": "string"
      +        },
      +        "where": {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "field": {
      +                "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"
      +                  }
      +                ]
      +              }
      +            },
      +            "required": [
      +              "field",
      +              "op"
      +            ],
      +            "type": "object"
      +          },
      +          "maxItems": 10,
      +          "type": "array"
      +        },
      +        "width": {
      +          "maximum": 12,
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "id",
      +        "type"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 12,
      +    "type": "array"
      +  },
      +  "description": {
      +    "maxLength": 1000,
      +    "type": "string"
      +  },
      +  "filters": {
      +    "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"
      +  },
      +  "schema": {
      +    "enum": [
      +      "jobmojito.report/v1"
      +    ],
      +    "type": "string"
      +  },
      +  "title": {
      +    "maxLength": 120,
      +    "minLength": 1,
      +    "type": "string"
      +  }
      +}
    • addedInput schema / properties / definition / required
      Added value: +[
      +  "schema",
      +  "title",
      +  "blocks"
      +]
    • addedInput schema / properties / definition / type
      Added value: +"object"
    • changedInput schema / properties / report_id / description
      Previous value: -"Optional: update this saved report instead of creating one (exactly as update_report)."New value: +"Optional: replace the definition of this saved report instead of creating one."
  3. Changed7 schema fields changed
    • changedInput schema / properties / definition / allOf
      Previous 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"
      -  },
      -  {
      -    "description": "A custom report: report-wide filters and up to 12 blocks. Read report-catalog first for the dataset, field and measure ids (every block needs an id and a type; measures are measure ids as strings, at least one). Format, rules and examples: https://developer.jobmojito.com/api-reference/reports/create-a-custom-report.md"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "blocks": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "compare": {
      +              "enum": [
      +                "previous_period"
      +              ],
      +              "type": "string"
      +            },
      +            "dataset": {
      +              "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": {
      +                        "enum": [
      +                          "day",
      +                          "week",
      +                          "month",
      +                          "quarter",
      +                          "year"
      +                        ],
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "field"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              "maxItems": 2,
      +              "type": "array"
      +            },
      +            "id": {
      +              "pattern": "^[A-Za-z0-9_-]{1,40}$",
      +              "type": "string"
      +            },
      +            "limit": {
      +              "maximum": 500,
      +              "minimum": 1,
      +              "type": "integer"
      +            },
      +            "measures": {
      +              "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": {
      +                    "pattern": "^[a-z][a-z0-9_]{0,40}$",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "field"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "type": "array"
      +            },
      +            "text": {
      +              "maxLength": 4000,
      +              "type": "string"
      +            },
      +            "title": {
      +              "maxLength": 120,
      +              "type": "string"
      +            },
      +            "type": {
      +              "enum": [
      +                "kpi",
      +                "table",
      +                "bar",
      +                "stacked_bar",
      +                "line",
      +                "funnel",
      +                "text"
      +              ],
      +              "type": "string"
      +            },
      +            "where": {
      +              "items": {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "field": {
      +                    "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"
      +                      }
      +                    ]
      +                  }
      +                },
      +                "required": [
      +                  "field",
      +                  "op"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 10,
      +              "type": "array"
      +            },
      +            "width": {
      +              "maximum": 12,
      +              "minimum": 1,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "id",
      +            "type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "type": "array"
      +      },
      +      "description": {
      +        "maxLength": 1000,
      +        "type": "string"
      +      },
      +      "filters": {
      +        "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"
      +      },
      +      "schema": {
      +        "enum": [
      +          "jobmojito.report/v1"
      +        ],
      +        "type": "string"
      +      },
      +      "title": {
      +        "maxLength": 120,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "schema",
      +      "title",
      +      "blocks"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "A custom report: report-wide filters and up to 12 blocks."
      +  }
      +]
    • addedInput schema / properties / llm_model
      Added value: +{
      +  "description": "Your model id, e.g. \"claude-opus-4-8\"; \"unknown\" if unsure. For analytics.",
      +  "type": "string"
      +}
    • changedInput schema / properties / report_id / description
      Previous value: -"Optional: update this saved report instead of creating one (exactly as update_report). Needs version."New value: +"Optional: update this saved report instead of creating one (exactly as update_report)."
    • changedInput schema / properties / target / description
      Previous value: -"With report_id: published (default) or draft. A private report always publishes. Through the MCP server a shared report always gets a draft that its owner publishes in the admin."New value: +"With report_id: published (default) or draft."
    • removedOutput schema / properties / admin_url / description
      Removed value: -"Open the report in the JobMojito admin."
    • removedOutput schema / properties / published / description
      Removed value: -"false when the change was stored as a draft the owner publishes in the admin."
    • removedOutput schema / properties / version / description
      Removed value: -"Send it back with the next update."
  4. Added

TDQS

A4.7/5.0
Behavior5/5

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

Goes well past the annotations: new reports are created as 'Only me' and shared from the returned admin_url, a replacement overwrites the entire definition (consistent with destructiveHint=true), and on a report shared with other people the write lands as a draft the owner must publish while a private report updates immediately. That side-effect asymmetry is exactly the context an agent cannot infer from readOnlyHint/destructiveHint or the schema, and it does not contradict them.

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 two modes with a compact 'Without X / With X' structure and every clause carries real behavioral weight rather than restating the schema. The trailing 'Every argument in full, with examples: get_tool_reference' is a useful pointer but slightly dilutes an otherwise tight paragraph, and the sentences are long enough to reward careful reading.

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?

For a mutation tool with a deep nested definition object, the description covers the things that actually change outcomes: visibility defaults, share path, draft-vs-live semantics, and the validation alternative. It leans on the output schema for the returned admin_url and on get_tool_reference for field-level detail, which is acceptable; only the merchant_id/admin scoping caveat is left entirely to the 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 description coverage is 100%, so the baseline is 3; the description still adds the branch meaning of report_id (replace instead of create) and pairs version with get_report as its source. It leaves the deep `definition` structure to the schema, which is reasonable given the object is fully self-documented, but `merchant_id`, `conversation_id` and `llm_model` are untouched in prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (save) and resource (custom report) and splits the behavior into two unmistakable modes: no report_id creates, with report_id replaces the whole definition. It also names the sibling that does the read (get_report) and the sibling that only validates (run_report), so an agent can route correctly without opening any schema.

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?

Explicit when-to-use guidance for both branches — create when there is no report_id, replace when you have a report_id plus the version from get_report — and it names the alternative for validation-only work (run_report with a definition and no report_id). It also pre-empts a wrong turn by saying `target` has no effect through this server, whatever its value.

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.