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
| Name | Required | Description | Default |
|---|---|---|---|
| expense_id | Yes | ID of the expense to update | |
| memo | No | Memo text to attach to the expense (optional) | |
| category | No | Category of the expense (optional) | |
| budget_id | No | ID of the budget to associate with the expense (optional) | |
| department_id | No | ID of the department to associate with the expense (optional) | |
| location_id | No | ID of the location to associate with the expense (optional) | |
| custom_fields | No | Custom fields to update (optional) |
Implementation Reference
- src/tools/updateExpense.ts:115-154 (handler)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; } });
- src/tools/updateExpense.ts:54-75 (helper)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)}`); } }
- src/tools/index.ts:344-392 (schema)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"] }
- src/tools/index.ts:50-50 (registration)Invocation of registerUpdateExpense to register the update_expense tool handler during tools initialization.registerUpdateExpense(server);
- src/tools/updateExpense.ts:114-155 (registration)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; } }); }