update_expense
Modify an existing card expense by updating its 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 |
|---|---|---|---|
| budget_id | No | ID of the budget to associate with the expense (optional) | |
| category | No | Category of the expense (optional) | |
| custom_fields | No | Custom fields to update (optional) | |
| department_id | No | ID of the department to associate with the expense (optional) | |
| expense_id | Yes | ID of the expense to update | |
| location_id | No | ID of the location to associate with the expense (optional) | |
| memo | No | Memo text to attach to the expense (optional) |
Implementation Reference
- src/tools/updateExpense.ts:115-154 (handler)The primary handler function registered for the 'update_expense' tool. It validates input parameters, extracts update data, calls the Brex API to update the expense, and formats the success/error 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:20-31 (schema)TypeScript interface defining the input parameters for the update_expense tool, used for validation and typing.interface UpdateExpenseParams { expense_id: string; memo?: string; category?: string; budget_id?: string; department_id?: string; location_id?: string; custom_fields?: Array<{ key: string; value: any; }>; }
- src/tools/updateExpense.ts:36-45 (schema)TypeScript interface defining the expected response shape from the expense update operation.interface UpdateExpenseResponse { id: string; memo?: string; category?: string; budget_id?: string; department_id?: string; location_id?: string; updated_at: string; status: string; }
- src/tools/updateExpense.ts:114-155 (registration)Function that registers the 'update_expense' tool handler using registerToolHandler, called from index.ts.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; } }); }
- src/tools/index.ts:50-50 (registration)Invocation of registerUpdateExpense within the registerTools function, integrating the tool into the MCP server.registerUpdateExpense(server);
- src/tools/index.ts:343-392 (schema)JSON schema definition for the 'update_expense' tool provided in the listTools response, defining input validation for MCP clients.{ 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/updateExpense.ts:54-75 (helper)Core helper function that performs the actual Brex API call to update the expense using PUT /v1/expenses/card/{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)}`); } }