Skip to main content
Glama

update_expense

Modify existing card expense details like memo, category, budget, department, location, or custom fields to maintain accurate financial records.

Instructions

Update an existing card expense

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
expense_idYesID of the expense to update
memoNoMemo text to attach to the expense (optional)
categoryNoCategory of the expense (optional)
budget_idNoID of the budget to associate with the expense (optional)
department_idNoID of the department to associate with the expense (optional)
location_idNoID of the location to associate with the expense (optional)
custom_fieldsNoCustom fields to update (optional)

Implementation Reference

  • Primary handler logic for the update_expense tool. Validates input parameters, extracts update data, calls Brex API via helper function, and returns a formatted JSON response.
    registerToolHandler("update_expense", async (request: ToolCallRequest) => { try { // Validate parameters const params = validateParams(request.params.arguments); logDebug(`Updating expense with ID: ${params.expense_id}`); // Get Brex client const brexClient = getBrexClient(); try { // Extract the update data (everything except the expense_id) const { expense_id, ...updateData } = params; // Update the expense const updateResult = await updateExpense(brexClient, expense_id, updateData); logDebug(`Successfully updated expense with ID: ${updateResult.id}`); return { content: [{ type: "text", text: JSON.stringify({ status: "success", expense_id: updateResult.id, updated_at: updateResult.updated_at, expense_status: updateResult.status, updated_fields: Object.keys(updateData).filter(key => updateData[key as keyof typeof updateData] !== undefined), message: `Expense ${updateResult.id} was updated successfully.` }, null, 2) }] }; } catch (apiError) { logError(`Error updating expense: ${apiError instanceof Error ? apiError.message : String(apiError)}`); throw new Error(`Failed to update expense: ${apiError instanceof Error ? apiError.message : String(apiError)}`); } } catch (error) { logError(`Error in update_expense tool: ${error instanceof Error ? error.message : String(error)}`); throw error; } });
  • Core helper function that executes the Brex API PUT request to update a card expense by ID.
    async function updateExpense( client: BrexClient, expenseId: string, updateData: Omit<UpdateExpenseParams, 'expense_id'> ): Promise<UpdateExpenseResponse> { try { logDebug(`Updating expense with ID: ${expenseId}`); // Make API call to Brex to update the expense const response = await client.put(`/v1/expenses/card/${expenseId}`, updateData); // Validate the response if (!response || !response.id) { throw new Error("Invalid response from expense update request"); } return response; } catch (error) { logError(`Failed to update expense: ${error instanceof Error ? error.message : String(error)}`); throw new Error(`Expense update failed: ${error instanceof Error ? error.message : String(error)}`); } }
  • JSON input schema for the update_expense tool, as exposed in the MCP listTools response. Defines parameters, descriptions, and requirements.
    name: "update_expense", description: "Update an existing card expense", inputSchema: { type: "object", properties: { expense_id: { type: "string", description: "ID of the expense to update" }, memo: { type: "string", description: "Memo text to attach to the expense (optional)" }, category: { type: "string", description: "Category of the expense (optional)" }, budget_id: { type: "string", description: "ID of the budget to associate with the expense (optional)" }, department_id: { type: "string", description: "ID of the department to associate with the expense (optional)" }, location_id: { type: "string", description: "ID of the location to associate with the expense (optional)" }, custom_fields: { type: "array", description: "Custom fields to update (optional)", items: { type: "object", properties: { key: { type: "string", description: "Key of the custom field" }, value: { type: "object", description: "Value of the custom field" } } } } }, required: ["expense_id"] }
  • Invocation of registerUpdateExpense to register the update_expense tool handler during tools initialization.
    registerUpdateExpense(server);
  • Module-level registration function for the update_expense tool, called from index.ts to set up the handler.
    export function registerUpdateExpense(_server: Server): void { registerToolHandler("update_expense", async (request: ToolCallRequest) => { try { // Validate parameters const params = validateParams(request.params.arguments); logDebug(`Updating expense with ID: ${params.expense_id}`); // Get Brex client const brexClient = getBrexClient(); try { // Extract the update data (everything except the expense_id) const { expense_id, ...updateData } = params; // Update the expense const updateResult = await updateExpense(brexClient, expense_id, updateData); logDebug(`Successfully updated expense with ID: ${updateResult.id}`); return { content: [{ type: "text", text: JSON.stringify({ status: "success", expense_id: updateResult.id, updated_at: updateResult.updated_at, expense_status: updateResult.status, updated_fields: Object.keys(updateData).filter(key => updateData[key as keyof typeof updateData] !== undefined), message: `Expense ${updateResult.id} was updated successfully.` }, null, 2) }] }; } catch (apiError) { logError(`Error updating expense: ${apiError instanceof Error ? apiError.message : String(apiError)}`); throw new Error(`Failed to update expense: ${apiError instanceof Error ? apiError.message : String(apiError)}`); } } catch (error) { logError(`Error in update_expense tool: ${error instanceof Error ? error.message : String(error)}`); throw error; } }); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/crazyrabbitLTC/mcp-brex-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server