Skip to main content
Glama
calebl
by calebl

ynab_get_unapproved_transactions

Retrieve unapproved YNAB transactions for review, automatically fetching recent changes after initial setup to maintain budget oversight.

Instructions

Gets unapproved transactions from a budget. First time pulls last 3 days, subsequent pulls use server knowledge to get only changes.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
budgetIdNoThe ID of the budget to fetch transactions for (optional, defaults to the budget set in the YNAB_BUDGET_ID environment variable)

Implementation Reference

  • The execute function that implements the tool's core logic: resolves budget ID, fetches unapproved transactions from YNAB API, filters and transforms data, returns formatted JSON response or error.
    export async function execute(input: GetUnapprovedTransactionsInput, api: ynab.API) { try { const budgetId = getBudgetId(input.budgetId); console.error(`Getting unapproved transactions for budget ${budgetId}`); const response = await api.transactions.getTransactions( budgetId, undefined, ynab.GetTransactionsTypeEnum.Unapproved ); // Transform the transactions to a more readable format const transactions = response.data.transactions .filter((transaction) => !transaction.deleted) .map((transaction) => ({ id: transaction.id, date: transaction.date, amount: (transaction.amount / 1000).toFixed(2), // Convert milliunits to actual currency memo: transaction.memo, approved: transaction.approved, account_name: transaction.account_name, payee_name: transaction.payee_name, category_name: transaction.category_name, transfer_account_id: transaction.transfer_account_id, transfer_transaction_id: transaction.transfer_transaction_id, matched_transaction_id: transaction.matched_transaction_id, import_id: transaction.import_id, })); return { content: [{ type: "text" as const, text: JSON.stringify({ transactions, transaction_count: transactions.length, }, null, 2) }] }; } catch (error) { console.error("Error getting unapproved transactions:", error); return { content: [{ type: "text" as const, text: JSON.stringify({ success: false, error: getErrorMessage(error), }, null, 2) }] }; } }
  • Tool metadata including name, description, and Zod input schema for optional budgetId parameter.
    export const name = "ynab_get_unapproved_transactions"; export const description = "Gets unapproved transactions from a budget. First time pulls last 3 days, subsequent pulls use server knowledge to get only changes."; export const inputSchema = { budgetId: z.string().optional().describe("The ID of the budget to fetch transactions for (optional, defaults to the budget set in the YNAB_BUDGET_ID environment variable)"), };
  • src/index.ts:39-43 (registration)
    MCP server registration of the tool, specifying title, description, inputSchema, and handler wrapper calling the tool's execute function with YNAB API.
    server.registerTool(GetUnapprovedTransactionsTool.name, { title: "Get Unapproved Transactions", description: GetUnapprovedTransactionsTool.description, inputSchema: GetUnapprovedTransactionsTool.inputSchema, }, async (input) => GetUnapprovedTransactionsTool.execute(input, api));
  • Helper function to resolve and validate the budget ID from input parameter or YNAB_BUDGET_ID environment variable.
    function getBudgetId(inputBudgetId?: string): string { const budgetId = inputBudgetId || process.env.YNAB_BUDGET_ID || ""; if (!budgetId) { throw new Error("No budget ID provided. Please provide a budget ID or set the YNAB_BUDGET_ID environment variable."); } return budgetId; }

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/calebl/ynab-mcp-server'

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