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 obtain each full expenseId, then pass those exact identities; never select every report row or infer a business purpose, category, or attendee. This compatibility tool uses the same reviewed workflow as correct_expenses: the first call always prepares a grounded preview and makes no change, 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 more than 100-row cleanup open https://www.expensebot.ai/review-expenses?source=mcp.

Input Schema

TableJSON 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

TableJSON 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.8/5.0
Behavior5/5

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

Goes well beyond annotations: discloses the preview-first / no-change-on-first-call behavior even if confirm:true arrives early, the idempotency contract (repeat same operationId/selection/change), approval gating, result reporting (applied/conflicted/failed counts), and Undo support. Destructive and openWorld annotations are consistent with the described mutate+Undo profile.

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 scope and safety in the first clauses and stays information-dense, but the single paragraph runs long and mixes workflow, constraints, and fallback routing; a sentence break would improve scannability.

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 a destructive, confirmation-gated, idempotent mutation with an output schema present, the description covers the full agent-relevant surface: preconditions, preview/confirm loop, idempotency, conflict handling, and escape hatches. Nothing critical is missing.

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 the schema already carries most parameter detail. Description adds meaningful semantics the schema doesn't: the identity-vs-row-selection distinction on expenseId, never infer business purpose/category/attendee, and the confirm/operationId pairing. Minor value-add over an already complete schema.

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+resource (correct compliance issues on a bounded set of recorded expenses) and explicitly positions itself against siblings check_compliance, correct_expenses, group_expenses. An agent can route 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 ('only after the user explicitly asks to fix issues found by check_compliance'), prerequisites ('use search_expenses to obtain each full expenseId'), and named alternatives ('for tags/groups use group_expenses', overflow link for >100 rows). Exclusions are stated clearly.

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.