Skip to main content
Glama

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
NameRequiredDescriptionDefault
budget_idNoID of the budget to associate with the expense (optional)
categoryNoCategory of the expense (optional)
custom_fieldsNoCustom fields to update (optional)
department_idNoID of the department to associate with the expense (optional)
expense_idYesID of the expense to update
location_idNoID of the location to associate with the expense (optional)
memoNoMemo text to attach to the expense (optional)

Implementation Reference

  • 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; } });
  • 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; }>; }
  • 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; }
  • 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; } }); }
  • Invocation of registerUpdateExpense within the registerTools function, integrating the tool into the MCP server.
    registerUpdateExpense(server);
  • 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"] }
  • 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)}`); } }

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