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 user's intended group is unclear. For requests such as 'all expenses in August except personal', set excludePersonal=true; this 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 that need visual review. Reports scoped to an existing client/project/trip group include matching expenses that are not already assigned to another ordinary report. Can optionally share with recipients. If no unreported matches remain, create no duplicate report and explain that the expenses are already in Reports. Terminal results also include role-appropriate accountingHandoffUrls from the server capability matrix and the existing reviewed file-export workflow. Use only the exact destination the user requested; 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 separate analysis.

Input Schema

TableJSON 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 — pick the shape that matches 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

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

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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"
      +}
  2. 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"
      +}
  3. 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
  4. Changed1 schema field changed
    • addedInput schema / properties / categories / description
      Added value: +"Optional configured expense categories to include in the report."
  5. First observed

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare destructiveHint=true, openWorldHint=true, readOnlyHint=false, so the safety bar is partly covered. The description adds substantial non-schema behavior: dedup logic (no duplicate report if no unreported matches), the scope rule that grouped reports pull in unassigned matching expenses, sharing/role semantics, and the caveat that the link does not mean an export occurred. It stops short of explicitly framing the mutation/destructive impact on expense assignment.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

Purpose is front-loaded and readable, but the description is long and overlaps the schema (excludePersonal, recipientRole, shareWith) and the output schema (returned summary, links, applied filters, handoff URLs). Several clauses restate structured fields rather than adding new signal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation tool with annotations and an output schema, the description covers the critical gaps: dedup behavior, scope of included expenses, sharing roles, sibling-tool routing, and the meaning of the returned link. An agent has everything needed to invoke it 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 description coverage is already 100%, so the baseline is 3. The description still adds meaning: it explains that excludePersonal removes both the Personal tag and the Personal category (matching Report Wizard) and clarifies the reviewer vs accountant intent for recipientRole, going beyond the schema 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?

States a specific verb (Create) and resource (expense report) plus the scoping inputs (date, client, project, trip, category, merchant). It is clearly distinguishable from siblings like list_reports and get_report_details, which are read/retrieval operations.

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?

Explicitly routes to list_tags when the group is unclear, gives a concrete trigger for excludePersonal ('all expenses in August except personal'), and explicitly forbids calling check_compliance, get_report_details, or tax tools before/after unless asked. This is when-to-use, when-not-to-use, and alternatives all in one.

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.