Skip to main content
Glama
jeangnc

YNAB MCP Server

by jeangnc

list_transactions

Retrieve budget transactions from YNAB with filters for date, type, category, payee, or account to analyze spending patterns.

Instructions

Get transactions for a budget. Supports filtering by date, type, category, payee, and account.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
budget_idYesThe budget ID
since_dateNoOnly return transactions on or after this date (YYYY-MM-DD)
typeNoFilter by transaction type
category_idNoFilter by category ID
payee_idNoFilter by payee ID
account_idNoFilter by account ID

Implementation Reference

  • Core handler function in YNABClient class that implements the list_transactions tool logic by querying the YNAB API and applying client-side filters.
    async listTransactions(budgetId: string, params?: { sinceDate?: string; type?: string; categoryId?: string; payeeId?: string; accountId?: string; }) { let path = `/budgets/${budgetId}/transactions`; const queryParams: string[] = []; if (params?.sinceDate) queryParams.push(`since_date=${params.sinceDate}`); if (params?.type) queryParams.push(`type=${params.type}`); if (queryParams.length > 0) { path += `?${queryParams.join("&")}`; } let result = await this.request<{ transactions: any[] }>(path); // Client-side filtering for category and payee if (params?.categoryId) { result.transactions = result.transactions.filter(t => t.category_id === params.categoryId); } if (params?.payeeId) { result.transactions = result.transactions.filter(t => t.payee_id === params.payeeId); } if (params?.accountId) { result.transactions = result.transactions.filter(t => t.account_id === params.accountId); } return result; }
  • Zod schema used for input validation in the list_transactions tool handler.
    const TransactionsSchema = z.object({ budget_id: z.string().describe("The budget ID"), since_date: z.string().optional().describe("Only return transactions on or after this date (ISO format: YYYY-MM-DD)"), type: z.enum(["uncategorized", "unapproved"]).optional().describe("Filter by transaction type"), category_id: z.string().optional().describe("Filter by category ID"), payee_id: z.string().optional().describe("Filter by payee ID"), account_id: z.string().optional().describe("Filter by account ID"), });
  • src/index.ts:217-232 (registration)
    Tool registration entry in the tools array, defining name, description, and input schema for list_tools request.
    { name: "list_transactions", description: "Get transactions for a budget. Supports filtering by date, type, category, payee, and account.", inputSchema: { type: "object" as const, properties: { budget_id: { type: "string", description: "The budget ID" }, since_date: { type: "string", description: "Only return transactions on or after this date (YYYY-MM-DD)" }, type: { type: "string", enum: ["uncategorized", "unapproved"], description: "Filter by transaction type" }, category_id: { type: "string", description: "Filter by category ID" }, payee_id: { type: "string", description: "Filter by payee ID" }, account_id: { type: "string", description: "Filter by account ID" }, }, required: ["budget_id"], }, },
  • Dispatch handler in the main CallToolRequestSchema handler that parses input and invokes the listTransactions method.
    case "list_transactions": { const params = TransactionsSchema.parse(args); result = await client.listTransactions(params.budget_id, { sinceDate: params.since_date, type: params.type, categoryId: params.category_id, payeeId: params.payee_id, accountId: params.account_id, }); break; }

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

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