Skip to main content
Glama
akutishevsky

LunchMoney MCP Server

by akutishevsky

create_category

Create new categories or category groups to organize transactions, with settings for income, archiving, budget, and totals.

Instructions

Create a new category or a category group. Set is_group=true to create a category group; supply children as an array of existing category IDs and/or strings (names of new sub-categories to create).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYesName of the category. 1-100 characters.
archivedNoWhether the category should be archived.
childrenNoOnly valid when is_group is true. Array of existing category IDs (numbers) and/or names of new sub-categories to create (strings).
group_idNoIf set, assigns the new category to an existing category group. Cannot be set if is_group is true.
is_groupNoIf true, creates a category group instead of a category. When true, group_id may not be set; use children to assign existing categories.
is_incomeNoWhether transactions in this category should be treated as income.
descriptionNoOptional description. Up to 200 characters.
exclude_from_budgetNoWhether transactions in this category should be excluded from budgets.
exclude_from_totalsNoWhether transactions in this category should be excluded from calculated totals.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv1.0.3
  2. Removedv1.0.2
  3. Changed13 schema fields changedv1.0.1
    • addedInput schema / $schema
      Added value: +"http://json-schema.org/draft-07/schema#"
    • addedInput schema / additionalProperties
      Added value: +false
    • addedInput schema / properties / archived
      Added value: +{
      +  "description": "Whether the category should be archived.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / children
      Added value: +{
      +  "description": "Only valid when is_group is true. Array of existing category IDs (numbers) and/or names of new sub-categories to create (strings).",
      +  "items": {
      +    "type": [
      +      "number",
      +      "string"
      +    ]
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / description
      Added value: +{
      +  "description": "Optional description. Up to 200 characters.",
      +  "maxLength": 200,
      +  "type": "string"
      +}
    • addedInput schema / properties / exclude_from_budget
      Added value: +{
      +  "description": "Whether transactions in this category should be excluded from budgets.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / exclude_from_totals
      Added value: +{
      +  "description": "Whether transactions in this category should be excluded from calculated totals.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / group_id
      Added value: +{
      +  "description": "If set, assigns the new category to an existing category group. Cannot be set if is_group is true.",
      +  "type": "number"
      +}
    • removedInput schema / properties / input
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "archived": {
      -      "default": false,
      -      "description": "Whether or not category should be archived.",
      -      "type": "boolean"
      -    },
      -    "description": {
      -      "default": "",
      -      "description": "Description of category. Must be less than 140 characters.",
      -      "type": "string"
      -    },
      -    "exclude_from_budget": {
      -      "default": false,
      -      "description": "Whether or not transactions in this category should be excluded from budgets.",
      -      "type": "boolean"
      -    },
      -    "exclude_from_totals": {
      -      "default": false,
      -      "description": "Whether or not transactions in this category should be excluded from calculated totals.",
      -      "type": "boolean"
      -    },
      -    "group_id": {
      -      "description": "Assigns the newly-created category to an existing category group.",
      -      "type": "number"
      -    },
      -    "is_income": {
      -      "default": false,
      -      "description": "Whether or not transactions in this category should be treated as income.",
      -      "type": "boolean"
      -    },
      -    "name": {
      -      "description": "Name of category. Must be between 1 and 40 characters.",
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "name"
      -  ],
      -  "type": "object"
      -}
    • addedInput schema / properties / is_group
      Added value: +{
      +  "description": "If true, creates a category group instead of a category. When true, group_id may not be set; use children to assign existing categories.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / is_income
      Added value: +{
      +  "description": "Whether transactions in this category should be treated as income.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / name
      Added value: +{
      +  "description": "Name of the category. 1-100 characters.",
      +  "maxLength": 100,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "input"
      -]New value: +[
      +  "name"
      +]
  4. First observedv1.0.0

TDQS

A4.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only provide `idempotentHint: false`, but the description does not elaborate on behavioral traits like side effects, state changes, or error conditions. It explains the `children` mechanism but offers no transparency beyond what the schema implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that efficiently covers the core functionality and key conditional rules, with no extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description adequately covers the main decision points (category vs group) given the tool's complexity and absence of output schema. However, it does not mention return values, error scenarios, or validation conflicts (e.g., setting both `is_group` and `group_id`).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds significant value by explaining the conditional logic between `is_group`, `group_id`, and `children`. It clarifies that `children` can be existing IDs or new names, which is not evident from individual parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a new 'category' or 'category group', with specific guidance on using `is_group`. It distinguishes the two modes and mentions `children` for groups, effectively differentiating from sibling tools like `update_category` or `get_single_category`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear guidance on when to use `is_group=true` vs `false`, and that `children` is only valid for groups. However, it lacks explicit when-not or alternative tool recommendations (e.g., using `get_all_categories` to check existing groups).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.