Skip to main content
Glama

create_report

Destructive

Create an expense report from a clear date, client, project, trip, category or merchant request. Tags are ExpenseBot's grouping layer for clients, projects, project codes and trips; call list_tags when the intended group is unclear. For 'all expenses in August except personal' set excludePersonal=true (excludes both the Personal tag and Personal expense category, matching ExpenseBot's Report Wizard). Returns the report summary, exact report link, Bill Client link, applied filters, and a prefilled Report Wizard fallback for criteria needing visual review. Reports scoped to an existing client/project/trip group include matching expenses not already on another ordinary report. Can optionally share with recipients. If no unreported matches remain, no duplicate report is created; explain the expenses are already in Reports. Terminal results also include role-appropriate accountingHandoffUrls; use only the exact destination the user requested, since the link opens the reviewed app flow and does not mean an export occurred. Complete the requested report directly; do not call check_compliance, get_report_details or tax/deductibility tools before or after it unless the user explicitly asks for that analysis.

Input Schema

NameRequiredDescriptionDefault
tagsNoExisting ExpenseBot groups to include, such as a client, project, project code, property, or trip. Use list_tags first when uncertain.
titleNoCustom report title
dateRangeNoTime period filter; use exactly one variant matching the user's phrasing.
shareWithNoEmail addresses to share the report with
categoriesNoOptional configured expense categories to include in the report.
excludedTagsNoExisting ExpenseBot groups to exclude from the report.
recipientRoleNoAccess for every shareWith recipient. Use reviewer for one-report review, comments, approval, or change requests. Use accountant only when the user explicitly wants ongoing report management and accounting-software access.reviewer
excludePersonalNoExclude expenses whose Tag is Personal or whose Expense Category is Personal.
excludedCategoriesNoExpense categories to exclude from the report.

Output Schema

NameRequiredDescriptionDefault
dataNo
successYes
reportIdNo
reportUrlNo
finalAnswerNo
nextActionsNo
billClientUrlNo
creationStatusNo
responseGuidanceNo
accountingSetupUrlNo
accountingHandoffUrlsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / dateRange / description
      Previous value: -"Time period filter. Use exactly one variant — pick the shape that matches the user's phrasing."New value: +"Time period filter; use exactly one variant matching the user's phrasing."
    • changedInput schema / properties / dateRange / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "month": {
      -        "description": "Month name or 1-12 (e.g., 'March' or '3')",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "month",
      -        "type": "string"
      -      },
      -      "year": {
      -        "description": "4-digit year (e.g., 2026)",
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "month",
      -      "year"
      -    ],
      -    "title": "Specific month",
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "quarter": {
      -        "maximum": 4,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "quarter",
      -        "type": "string"
      -      },
      -      "year": {
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "quarter",
      -      "year"
      -    ],
      -    "title": "Quarter of a year",
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "type": {
      -        "const": "year",
      -        "type": "string"
      -      },
      -      "year": {
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "year"
      -    ],
      -    "title": "Full year",
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "end": {
      -        "description": "ISO date YYYY-MM-DD (inclusive)",
      -        "format": "date",
      -        "type": "string"
      -      },
      -      "start": {
      -        "description": "ISO date YYYY-MM-DD (inclusive)",
      -        "format": "date",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "specific",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "start",
      -      "end"
      -    ],
      -    "title": "Specific date range",
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "type": {
      -        "const": "relative",
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Relative range phrase, e.g., 'last month', 'YTD', 'this quarter', 'last 7 days'",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "value"
      -    ],
      -    "title": "Relative natural-language range",
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "month": {
      +        "description": "Month name or 1-12 (e.g., 'March' or '3')",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "month",
      +        "type": "string"
      +      },
      +      "year": {
      +        "description": "4-digit year (e.g., 2026)",
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "month",
      +      "year"
      +    ],
      +    "title": "Specific month",
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "quarter": {
      +        "maximum": 4,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "quarter",
      +        "type": "string"
      +      },
      +      "year": {
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "quarter",
      +      "year"
      +    ],
      +    "title": "Quarter of a year",
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "type": {
      +        "const": "year",
      +        "type": "string"
      +      },
      +      "year": {
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "year"
      +    ],
      +    "title": "Full year",
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "end": {
      +        "description": "ISO date YYYY-MM-DD (inclusive)",
      +        "format": "date",
      +        "type": "string"
      +      },
      +      "start": {
      +        "description": "ISO date YYYY-MM-DD (inclusive)",
      +        "format": "date",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "specific",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "start",
      +      "end"
      +    ],
      +    "title": "Specific date range",
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "type": {
      +        "const": "relative",
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Relative phrase, e.g. 'last month', 'YTD', 'last 7 days'",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "value"
      +    ],
      +    "title": "Relative natural-language range",
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "accountingHandoffUrls": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "accountingSetupUrl": {
      +      "type": "string"
      +    },
      +    "billClientUrl": {
      +      "type": "string"
      +    },
      +    "creationStatus": {
      +      "type": "string"
      +    },
      +    "data": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "appReportUrl": {
      +          "type": "string"
      +        },
      +        "appliedFilters": {
      +          "additionalProperties": true,
      +          "type": "object"
      +        },
      +        "billClientUrl": {
      +          "type": "string"
      +        },
      +        "creationStatus": {
      +          "type": "string"
      +        },
      +        "functionalTotal": {
      +          "type": "number"
      +        },
      +        "homeCurrency": {
      +          "type": "string"
      +        },
      +        "link": {
      +          "type": "string"
      +        },
      +        "personalExcludedCount": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "receiptCount": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "reportId": {
      +          "type": "string"
      +        },
      +        "title": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "finalAnswer": {
      +      "type": "string"
      +    },
      +    "nextActions": {
      +      "items": {
      +        "additionalProperties": true,
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "reportId": {
      +      "type": "string"
      +    },
      +    "reportUrl": {
      +      "type": "string"
      +    },
      +    "responseGuidance": {
      +      "type": "string"
      +    },
      +    "success": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "success"
      +  ],
      +  "type": "object"
      +}
  3. Changed1 schema field changed
    • addedInput schema / properties / recipientRole
      Added value: +{
      +  "default": "reviewer",
      +  "description": "Access for every shareWith recipient. Use reviewer for one-report review, comments, approval, or change requests. Use accountant only when the user explicitly wants ongoing report management and accounting-software access.",
      +  "enum": [
      +    "reviewer",
      +    "accountant"
      +  ],
      +  "type": "string"
      +}
  4. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -{
      -  "additionalProperties": true,
      -  "description": "Standard ExpenseBot tool result envelope. `message` is the human-readable summary the AI cites; `data` is the structured payload (totals, breakdowns, ids, etc.). On failure, `success` is false and `error` carries a code/message/hint triple.",
      -  "properties": {
      -    "data": {
      -      "additionalProperties": true,
      -      "description": "Structured payload. Shape varies per tool — common keys: total, breakdown, comparison, sampleMeta, ids, expenseId, reportId, signupUrl, results.",
      -      "type": "object"
      -    },
      -    "error": {
      -      "additionalProperties": true,
      -      "description": "Present only when success === false.",
      -      "properties": {
      -        "code": {
      -          "type": "string"
      -        },
      -        "hint": {
      -          "type": "string"
      -        },
      -        "message": {
      -          "type": "string"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "message": {
      -      "description": "Human-readable result text. Always present on success; prefer rendering this verbatim before any further reasoning.",
      -      "type": "string"
      -    },
      -    "sampleMeta": {
      -      "additionalProperties": true,
      -      "description": "Set when the underlying dataset was truncated. isTruncated=true means the agent saw a sample of `sampleCount` of `totalCount` rows; aggregate totals are still accurate.",
      -      "properties": {
      -        "isTruncated": {
      -          "type": "boolean"
      -        },
      -        "sampleCount": {
      -          "type": "integer"
      -        },
      -        "totalCount": {
      -          "type": "integer"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "success": {
      -      "description": "False on tool errors; check before reading `data`.",
      -      "type": "boolean"
      -    }
      -  },
      -  "type": "object"
      -}New value: +null
  5. Changed1 schema field changed
    • addedInput schema / properties / categories / description
      Added value: +"Optional configured expense categories to include in the report."
  6. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare readOnly=false and destructiveHint=true; the description adds real behavioral context beyond them: no duplicate report is created when no unreported matches remain, group-scoped reports only pull expenses not already on another ordinary report, and accountingHandoffUrls do not mean an export occurred. It stops short of clarifying the destructive/irreversible aspect implied by destructiveHint (what a created report locks or changes), so not a perfect score.

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?

Purpose and key routing advice are front-loaded, and nearly every sentence carries non-obvious operational detail (duplicate suppression, group scoping, handoff URLs, tool-call exclusions). It is dense and long, but the density is mostly justified rather than padding.

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?

An output schema exists, and the description still names the key returns (report summary, report link, Bill Client link, applied filters, Wizard fallback). Combined with the duplicate-suppression rule, sharing behavior, and the terminal handoff URL caveat, an agent has everything needed to call this correctly.

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 is 3; the description still adds meaning by explaining that tags are ExpenseBot's grouping layer for clients/projects/trips and that excludePersonal covers both the Personal tag and the Personal expense category to match Report Wizard behavior. It adds little on shareWith/recipientRole beyond what the schema already documents.

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

Purpose5/5

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

Opens with a specific verb+resource (create an expense report) and immediately scopes the inputs it accepts (date, client, project, trip, category, merchant). It is clearly distinguishable from siblings such as list_reports, get_report_details, and export_report, which it implicitly rules out via the 'do not call check_compliance, get_report_details...' instruction.

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 routing: call list_tags when the intended group is unclear, use excludePersonal=true for the 'all expenses except personal' case, use recipientRole only when ongoing accounting access is wanted. It also states negative conditions – do not pre- or post-call compliance, report-detail, or tax tools unless the user asks.

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.