Skip to main content
Glama

fix_compliance

Destructive

Safely correct compliance issues on an exact bounded set of recorded expenses. Use only after the user explicitly asks to fix issues found by check_compliance. Use search_expenses to get each full expenseId and pass those exact identities; never select every report row or infer a business purpose, category or attendee. Same reviewed workflow as correct_expenses: the first call always prepares a grounded preview and changes nothing, even if confirm:true arrives early. Show the exact proposed changes and ask once for approval; only after explicit approval repeat the same operationId, selection and change with confirm:true. The confirmed result reports applied/conflicted/failed counts and supports status and Undo. For tags/groups use group_expenses; for unsupported or over-100-row cleanup open https://www.expensebot.ai/review-expenses?source=mcp.

Input Schema

NameRequiredDescriptionDefault
undoNoUndo a completed correction within its Undo window.
changeNoExactly one correction. The selected type determines which matching value field is required.
statusNoRead operation status using operationId.
confirmNoOmit/false for preview; true only after explicit approval.
selectionNoExact expenses returned by search_expenses and approved for this bounded correction.
operationIdYesStable idempotency key generated once for preview and reused unchanged.

Output Schema

NameRequiredDescriptionDefault
undoNo
changeNo
statusYes
messageNo
previewNo
successYes
manifestNo
finalAnswerNo
operationIdNo
confirmationNo
responseGuidanceNo
reviewExpensesUrlNo
requiresConfirmationNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • removedInput schema / properties / action
      Removed value: -{
      -  "enum": [
      -    "add_purpose",
      -    "set_category",
      -    "add_tag"
      -  ],
      -  "type": "string"
      -}
    • addedInput schema / properties / change
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Exactly one correction. The selected type determines which matching value field is required.",
      +  "oneOf": [
      +    {
      +      "properties": {
      +        "type": {
      +          "const": "category"
      +        }
      +      },
      +      "required": [
      +        "category"
      +      ]
      +    },
      +    {
      +      "properties": {
      +        "type": {
      +          "const": "businessPurpose"
      +        }
      +      },
      +      "required": [
      +        "businessPurpose"
      +      ]
      +    },
      +    {
      +      "properties": {
      +        "type": {
      +          "const": "attendees"
      +        }
      +      },
      +      "required": [
      +        "attendees"
      +      ]
      +    }
      +  ],
      +  "properties": {
      +    "attendeeMode": {
      +      "description": "Use add unless the user explicitly asks to replace existing attendees.",
      +      "enum": [
      +        "add",
      +        "replace"
      +      ],
      +      "type": "string"
      +    },
      +    "attendees": {
      +      "description": "Attendee names explicitly supplied by the user when type is attendees; never infer names.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "maxItems": 25,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "businessPurpose": {
      +      "description": "User-supplied business purpose to apply when type is businessPurpose.",
      +      "type": "string"
      +    },
      +    "category": {
      +      "description": "Configured expense category to apply when type is category.",
      +      "type": "string"
      +    },
      +    "type": {
      +      "description": "The one correction kind to apply to every exact selected expense.",
      +      "enum": [
      +        "category",
      +        "businessPurpose",
      +        "attendees"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / confirm
      Added value: +{
      +  "description": "Omit/false for preview; true only after explicit approval.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / operationId
      Added value: +{
      +  "description": "Stable idempotency key generated once for preview and reused unchanged.",
      +  "pattern": "^expense-bulk:[a-zA-Z0-9_-]{8,100}$",
      +  "type": "string"
      +}
    • removedInput schema / properties / reportId
      Removed value: -{
      -  "type": "string"
      -}
    • addedInput schema / properties / selection
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Exact expenses returned by search_expenses and approved for this bounded correction.",
      +  "properties": {
      +    "items": {
      +      "description": "One exact receipt identity per selected expense; never broaden this list after preview.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "expected": {
      +            "additionalProperties": false,
      +            "description": "Optional optimistic-concurrency values copied from the search result.",
      +            "properties": {
      +              "category": {
      +                "description": "Current category observed before preview for conflict detection.",
      +                "type": "string"
      +              },
      +              "notes": {
      +                "description": "Current structured Notes value observed before preview for conflict detection.",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "receiptId": {
      +            "description": "Exact full expenseId/Column-Q receipt identity from search_expenses.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "receiptId"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 100,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "items"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / status
      Added value: +{
      +  "description": "Read operation status using operationId.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / undo
      Added value: +{
      +  "description": "Undo a completed correction within its Undo window.",
      +  "type": "boolean"
      +}
    • removedInput schema / properties / value
      Removed value: -{
      -  "description": "The value to apply",
      -  "type": "string"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "reportId",
      -  "action",
      -  "value"
      -]New value: +[
      +  "operationId"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "change": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "confirmation": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "finalAnswer": {
      +      "type": "string"
      +    },
      +    "manifest": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "message": {
      +      "type": "string"
      +    },
      +    "operationId": {
      +      "type": "string"
      +    },
      +    "preview": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "requiresConfirmation": {
      +      "type": "boolean"
      +    },
      +    "responseGuidance": {
      +      "type": "string"
      +    },
      +    "reviewExpensesUrl": {
      +      "type": "string"
      +    },
      +    "status": {
      +      "type": "string"
      +    },
      +    "success": {
      +      "type": "boolean"
      +    },
      +    "undo": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "success",
      +    "status"
      +  ],
      +  "type": "object"
      +}
  2. 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
  3. First observed

TDQS

A4.7/5.0
Behavior5/5

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

While annotations confirm destructive intent, the description adds critical operational behavior: it mandates a two-stage workflow (preview without changing anything, followed by explicit approval to execute), guarantees idempotency via 'operationId', and discloses outcome reporting (applied/conflicted/failed counts and Undo support).

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?

The definition is extremely verbose, detailing a complex multi-stage operational workflow (preview, approval, execution, reporting). While every sentence serves a functional purpose, the overall length sacrifices conciseness for maximum behavioral detail.

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 the complexity (multi-stage state change, idempotency, and failure modes), the description is highly complete. It successfully marries the low-level parameters provided by the schema with the high-level business logic and behavioral rules required for safe execution.

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?

With 100% schema description coverage, the baseline is 3. The description adds valuable constraints and context, such as specifying that selections must use 'exact full expenseId/Column-Q receipt identity' and that the `confirm:true` status is only valid *after* explicit user approval, adding necessary intent-based guidance beyond the structure.

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?

The description clearly identifies the function ('correct compliance issues'), the target resource ('recorded expenses'), and the strict prerequisite workflow (must use issues found by 'check_compliance'). This makes it immediately distinct from 'check_compliance' and 'correct_expenses' siblings.

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?

It provides explicit preconditions ('Use only after the user explicitly asks to fix issues found by check_compliance'). Furthermore, it mandates strict usage constraints (bounded set of expenses, exact IDs from search_expenses) and outlines a complex, staged workflow.

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.