Skip to main content
Glama
Jtewen

You Need A Budget (YNAB) MCP

by Jtewen

manage-payees

Merge and standardize multiple payee names into a single name to streamline and organize budgeting data in YNAB. Simplify payee management by consolidating duplicates or variants.

Instructions

Merge multiple payee names into a single name. Use this to clean up payee data, for example, by renaming 'STARBUCKS #123' and 'Starbucks Coffee' to just 'Starbucks'.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actionYesThe action to perform.
budget_idNoThe ID of the budget. If not provided, the default budget will be used.
nameNoThe new name for the payees. Required for 'rename' action.
payee_idsYesThe IDs of the payees to affect.

Implementation Reference

  • The handler function within handle_call_tool that executes the 'manage-payees' tool logic. It validates the input using ManagePayeesInput, determines the budget ID, and calls ynab_client.update_payees for the 'rename' action.
    elif name == "manage-payees":
        args = ManagePayeesInput.model_validate(arguments or {})
        budget_id = await _get_budget_id(args.model_dump())
    
        if args.action == "rename":
            await ynab_client.update_payees(
                budget_id=budget_id,
                payee_ids=args.payee_ids,
                name=args.name,
            )
            return [
                types.TextContent(
                    type="text",
                    text=f"Successfully renamed {len(args.payee_ids)} payees to '{args.name}'.",
                )
            ]
    elif name == "manage-budgeted-amount":
  • Pydantic model defining the input schema and validation for the 'manage-payees' tool, including action, payee_ids, and name fields.
    class ManagePayeesInput(BudgetIdInput):
        action: ManagePayeesAction = Field(..., description="The action to perform.")
        payee_ids: List[str] = Field(..., description="The IDs of the payees to affect.")
        name: Optional[str] = Field(None, description="The new name for the payees. Required for 'rename' action.")
    
        @model_validator(mode='before')
        @classmethod
        def check_fields_for_action(cls, values):
            action = values.get('action')
            if not action:
                raise ValueError("'action' is a required field.")
    
            if action == 'rename':
                if not values.get('name'):
                    raise ValueError("'name' is required for the 'rename' action.")
            
            return values 
  • Registration of the 'manage-payees' tool in the handle_list_tools function, specifying name, description, and input schema.
    types.Tool(
        name="manage-payees",
        description="Merge multiple payee names into a single name. Use this to clean up payee data, for example, by renaming 'STARBUCKS #123' and 'Starbucks Coffee' to just 'Starbucks'.",
        inputSchema=ManagePayeesInput.model_json_schema(),
    ),
  • Helper method in YNABClient that performs the actual payee renaming by concurrently updating each payee using update_payee.
    async def update_payees(self, budget_id: str, payee_ids: list[str], name: str):
        """Updates multiple payees to the same name."""
        tasks = [self.update_payee(budget_id, payee_id, name) for payee_id in payee_ids]
        await asyncio.gather(*tasks)

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

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