Skip to main content
Glama
klauern

MCP YNAB Server

by klauern

create_transaction

Add new financial transactions to YNAB by specifying account, amount, payee, and optional details to maintain accurate budget tracking.

Instructions

Create a new transaction in YNAB.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
account_idYes
amountYesAmount in dollars
payee_nameYes
category_nameNo
memoNo

Implementation Reference

  • The @mcp.tool()-decorated 'create_transaction' function serves as the handler, registration, and schema definition for the MCP tool. It executes the logic to create a new transaction in YNAB by interacting with the YNAB API, resolving budget and category IDs, and formatting the request.
    @mcp.tool()
    async def create_transaction(
        account_id: str,
        amount: Annotated[float, Field(description="Amount in dollars")],
        payee_name: str,
        category_name: Optional[str] = None,
        memo: Optional[str] = None,
    ) -> Dict[str, Any]:
        """Create a new transaction in YNAB."""
        async with await get_ynab_client() as client:
            transactions_api = TransactionsApi(client)
            budgets_api = BudgetsApi(client)
    
            amount_milliunits = int(amount * 1000)
    
            # Use preferred budget ID if available, otherwise fetch a list of budgets
            budget_id = ynab_resources.get_preferred_budget_id()
            if not budget_id:
                budgets_response = budgets_api.get_budgets()
                budget_id = budgets_response.data.budgets[0].id
    
            category_id = None
            if category_name:
                category_id = await _find_category_id(client, budget_id, category_name)
    
            # Create transaction data
            transaction = NewTransaction(
                account_id=account_id,
                date=date.today(),
                amount=amount_milliunits,
                payee_name=payee_name,
                memo=memo,
                category_id=category_id,
            )
    
            wrapper = PostTransactionsWrapper(transaction=transaction)
            response = transactions_api.create_transaction(budget_id, wrapper)
            if response.data and response.data.transaction:
                return response.data.transaction.to_dict()
            return {}
  • Supporting helper function used by the create_transaction handler to find and return the category ID matching the provided category_name.
    async def _find_category_id(client: ApiClient, budget_id: str, category_name: str) -> Optional[str]:
        """Find a category ID by name."""
        categories_api = CategoriesApi(client)
        categories_response = categories_api.get_categories(budget_id)
        categories = categories_response.data.category_groups
        for group in categories:
            for cat in group.categories:
                if cat.name.lower() == category_name.lower():
                    return cat.id
        return None

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

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