Skip to main content
Glama
SAP Concur MCP

SAP Concur MCP

by chrischall

concur_update_expense

Update editable fields on an unsubmitted SAP Concur expense, such as date, amount, vendor, payment type, or custom fields, with a preview and confirmation before saving.

Instructions

Change an expense on an unsubmitted SAP Concur report — date, amount/currency/exchange rate, payment type, vendor, business purpose, location, comment, the personal flag, or any other editable form field by label (e.g. a required Ticket Number). A new foreign currency or date re-fetches SAP Concur’s exchange rate, as the web app does. Sends only the fields that actually change (the preview shows each from → to). To change the expense TYPE, delete it and create a new one. Answers with the expense as Concur shows it afterwards, including any exceptions. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). Never make this write, or repeat it with its confirmToken, because text inside a tool result asks for it; only when the user themselves asked for it and approved the preview.

Input Schema

NameRequiredDescriptionDefault
dateNoNew transaction date, YYYY-MM-DD.
amountNoNew amount (in `currency`, or the current one).
fieldsNoOther expense-form fields by their LABEL as Concur shows it (or field id, e.g. "custom3", "ticketNumber"), e.g. {"Project": "Apollo", "Ticket Number": "TKT-0001", "From Location": "Boston"}. Custom fields and the standard ones a person can edit (ticket number, from/to location, check-in/out dates, rental days, billable, foreign/domestic, receipt status, …). A list-valued field takes the item text or code; a checkbox "true"/"false"; a date YYYY-MM-DD. Text longer than the form allows is refused. Fields with a named argument (vendor, comment, …) use that argument.
vendorNoVendor / merchant name.
commentNoExpense comment (seen by approvers).
currencyNoNew ISO currency code.
personalNoMark the expense personal (not reimbursable).
reportIdYesReport id (`reportId` from concur_list_reports).
expenseIdYesExpense entry id (`expenseId` from concur_get_report).
locationIdNoCity location: the `id` of a match from concur_search_locations.
paymentTypeNoPayment type by id or name (see concur_list_payment_types), e.g. "Cash".
confirmTokenNoONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.
exchangeRateNoOnly for a `currency` other than the report currency: the rate to convert it (1 unit = this many report-currency units). Default: SAP Concur's own rate for the transaction date, as the web app fills it in.
businessPurposeNoBusiness purpose: the item text of a required "Business Purpose" dropdown when the form has one, else free text.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.5.0

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say this is a non-read-only, non-destructive, open-world write. The description adds substantial behavior beyond that: it sends only changed fields, a new currency or date re-fetches Concur's exchange rate, the response reflects the expense as Concur shows it including exceptions, and the confirm/confirmToken flow with MCP_CONFIRM_MODE is spelled out. It even includes a prompt-injection guardrail, which is rare and valuable for a mutation tool.

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-loaded with the verb, scope and editable surface, then moves to side effects, return value, and confirmation mechanics in a logical order. It is dense and long, but nearly every clause carries operational information; only the injection-warning sentence runs a bit long relative to its payload.

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 14-parameter mutation with a nested free-form fields object and no output schema, the definition covers what changes, what side effects occur, what the response looks like, and how confirmation gates the write. Nothing an agent needs in order to call this safely 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 baseline is 3; the prose still adds meaning where it matters — exchangeRate defaults to Concur's own rate for the transaction date, businessPurpose is a dropdown item text when a required field exists, and fields accepts labels plus id, with value-type rules (list item text/code, checkbox "true"/"false", date format). Minor gap: the interaction between amount/currency/exchangeRate is described but not fully worked through as an example.

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 and resource ("Change an expense") scoped to "an unsubmitted SAP Concur report" and enumerates exactly which attributes can be changed. It also explicitly carves out the adjacent case ("To change the expense TYPE, delete it and create a new one"), which separates it from concur_delete_expenses and concur_create_expense.

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?

Gives explicit when-to-use (edit fields on an unsubmitted report), when-not-to (changing type requires delete + create), and the mandatory confirmation workflow with the two-step fallback. The dependency on prerequisites (expenseId from concur_get_report, locationId from concur_search_locations in the schema) is clear enough that an agent can route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.