Zenmoney MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Zenmoney MCP Servershow my account balances and recent transactions"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@krislintigo-zenmoney/mcp-server
Model Context Protocol server for the Zenmoney personal-finance API.
It exposes read access to accounts, transactions, categories, budgets and merchants, plus the ability to create transactions.
Environment
Variable | Required | Description |
| yes | Zenmoney API access token. Receive here |
| no | Set to |
Related MCP server: LunchMoney MCP Server
Tools
Tool | Kind | Description |
| read-only | List accounts with balances, currencies and types ( |
| read-only | List transactions for a date range; filter by account, category, type; |
| read-only | List categories (tags) and their hierarchy; filter by |
| read-only | List merchants; filter by |
| read-only | List planned/recurring transactions; filter by |
| read-only | List planned income/outcome budget amounts per category for a |
| write | Create an income, expense or transfer transaction. |
| refresh | Force the next read to refetch fresh data instead of the cached snapshot (cache expires after 5 min anyway). |
Usage
Run straight from npm via npx:
{
"mcpServers": {
"zenmoney": {
"command": "npx",
"args": ["-y", "@krislintigo-zenmoney/mcp-server"],
"env": {
"ZENMONEY_ACCESS_TOKEN": "{your-zenmoney-access-token}"
}
}
}
}Available Tools
8 toolscreate_transactionCreate transactionA
Create a new income, expense, or transfer transaction. For income/expense: provide accountId and amount. For transfer: provide fromAccountId, toAccountId, fromAmount and toAmount. Use list_accounts to find account IDs and list_categories for category IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Transaction date (YYYY-MM-DD). Defaults to today in the server's local timezone. | |
| type | Yes | Transaction type. "income"/"expense" require accountId and amount; "transfer" requires fromAccountId, toAccountId, fromAmount and toAmount. | |
| payee | No | Optional payee or store name. | |
| amount | No | Amount for income or expense. | |
| comment | No | Optional comment. | |
| toAmount | No | Amount arriving at the destination account (in destination currency). | |
| accountId | No | Account ID for income or expense. Use list_accounts to find IDs. | |
| fromAmount | No | Amount leaving the source account (in source currency). | |
| categoryIds | No | Category IDs (income/expense only). Use list_categories to find IDs. | |
| toAccountId | No | Destination account ID for transfer. Use list_accounts to find IDs. | |
| fromAccountId | No | Source account ID for transfer. Use list_accounts to find IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | ID of the created transaction. |
| date | Yes | |
| type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral transparency. It explains the creation behavior and date default, but does not mention potential side effects, validation failures, transfer ledger behavior, or output/return details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, using two sentences to state the core action and the conditional parameter requirements. It avoids unnecessary detail while still conveying the essential usage rules.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex conditional schema with 11 parameters, the description is largely complete by explaining type-specific requirements and referencing relevant list tools. It does not describe the response shape, but the presence of an output schema and the focus on input parameters makes this a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters, and the description adds meaningful semantics by explaining conditional requirements per transaction type and referencing lookup tools for account/category IDs. The date default and currency intent of fromAmount/toAmount are also clarified beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Create a new income, expense, or transfer transaction.' It also differentiates the three transaction types and their required parameters, making it easy for an agent to know exactly what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit conditional usage: income/expense require accountId and amount, while transfers require fromAccountId, toAccountId, fromAmount and toAmount. It also points the agent to list_accounts and list_categories for finding IDs, giving clear practical guidance, though it does not explicitly describe when not to use this tool versus sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invalidate_cacheInvalidate cacheAIdempotent
Force the next tool call to fetch fresh data from Zenmoney instead of the cached snapshot (the cache normally expires on its own after 5 minutes). Use this if data may have changed outside this session — e.g. in the Zenmoney app or another client - and the next read must reflect it immediately.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| invalidated | Yes | The cache is now stale and will be refreshed on the next call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description accurately describes the behavior: it invalidates the cache and forces the next call to fetch fresh data. It also notes the normal cache expiry of 5 minutes, adding context. There is no contradiction with the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two clear sentences. Every word adds value, and the guidance is front-loaded with the primary action before the use-case explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers the tool's context: what it does, why it exists, and when to use it. Since there is no meaningful output schema for a cache invalidation operation, no further explanation is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so there are no parameter semantics to explain. The description correctly omits any parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: forcing the next tool call to fetch fresh data from Zenmoney instead of the cached snapshot. It uses specific verbs and identifies the resource affected, making it distinct from the sibling list/create tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use the tool: when data may have changed outside the session (e.g., in the Zenmoney app or another client) and the next read must reflect it immediately. This provides clear guidance for the AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList accountsARead-onlyIdempotent
List all user accounts with balances, currencies, and types. Use this to find account IDs for transaction filtering.
| Name | Required | Description | Default |
|---|---|---|---|
| includeArchived | No | Include archived accounts in the result. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds no extra behavioral details beyond the return content, which is captured by the output schema. This meets the baseline but does not exceed it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, consisting of two clear sentences. It provides the core functionality and a practical use case without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description does not need to document return values. It sufficiently covers what the tool does, what data it returns, and why it would be used, making it complete for its context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter (includeArchived) is fully described in the schema with its default and meaning. The tool description does not add further semantic value beyond what is already in the schema, so this is at the baseline for full parameter coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function ('List all user accounts') and specifies the data returned (balances, currencies, types). It also provides a concrete use case ('find account IDs for transaction filtering'), making the purpose unambiguous and distinct from sibling list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a specific scenario for when to use the tool ('to find account IDs for transaction filtering'), which implies when it is appropriate. However, it does not explicitly name alternatives or contrast with other list tools, so the guidance is not as explicit as it could be.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_budgetsList budgetsARead-onlyIdempotent
List planned budget amounts per category for a given month. Returns income and outcome budget limits.
| Name | Required | Description | Default |
|---|---|---|---|
| month | Yes | Month to retrieve budgets for (YYYY-MM). |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds no further behavioral details beyond 'List' and the return type, so it does not exceed the baseline for transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the action and resource, followed by a clear statement of the return content. No unnecessary words or redundant details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description states the key inputs and outputs, and the presence of an output schema covers the return format. It is complete for the tool's simple purpose, though it does not mention edge cases or error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes the 'month' parameter with a regex pattern and description, achieving 100% coverage. The description does not add additional meaning beyond the schema, so the baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: listing planned budget amounts per category for a given month, and specifies the return of income and outcome budget limits. This distinguishes it from sibling list tools like list_accounts and list_categories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool (for a given month's budget amounts) and indicates the expected output. It does not explicitly mention alternatives or exclusions, but the purpose is self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesList categoriesARead-onlyIdempotent
List expense/income categories (tags) with their hierarchy, optionally filtered by name. Use category IDs to filter transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of categories to return. | |
| query | No | Case-insensitive substring to filter categories by name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior; description adds mention of hierarchy and category IDs but does not describe pagination, sorting, default ordering, or potential limits beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the primary purpose, followed by a relevant usage hint. No redundancy or extraneous detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequately complete for a list tool: identifies resource type, mentions optional name filtering, and gives a practical use case (filtering transactions by category ID). Does not describe output structure, but no output schema is provided and it is not essential for this basic listing operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema already fully describes both parameters (limit and query) with explicit descriptions, including the case-insensitive substring semantics. The description's mention of 'filtered by name' is redundant with the schema and adds no new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists expense/income categories with hierarchy, uses a specific verb ('list') and resource ('categories'), and distinguishes itself from sibling list_* tools by resource type and by noting category IDs are used for filtering transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies when to use (to retrieve categories for filtering transactions) but does not explicitly contrast with alternative list_* tools or state when not to use. No explicit exclusions or alternative selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merchantsList merchantsARead-onlyIdempotent
List user merchants, optionally filtered by name.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of merchants to return. | |
| query | No | Case-insensitive substring to filter merchants by name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description accurately implies a read-only operation, matching the annotations. It adds no extra behavioral detail beyond what the annotations and parameter descriptions already provide, so the baseline score is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence, front-loads the main purpose, and contains no unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation, the description plus the complete parameter schema, annotations, and output schema provides all necessary context. No important invocation details are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are already fully described in the input schema (limit and query with their purposes and constraints). The description merely restates the optional name filter without adding further semantic meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List') and resource ('user merchants'), and notes an optional name filter. It clearly distinguishes itself from sibling list_* tools by the resource type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool—retrieving the user's merchants—and explains that filtering by name is optional. It does not explicitly contrast with sibling list tools, but the resource-specific wording makes the intended use obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_remindersList remindersARead-onlyIdempotent
List reminders — planned and recurring transactions such as subscriptions, bills, salary or scheduled transfers. Each reminder pairs a schedule (interval/step/startDate) with the transaction it generates. Use recurringOnly to exclude one-time plans and type to filter by income/expense/transfer.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by transaction type. | |
| limit | No | Maximum number of reminders to return. | |
| recurringOnly | No | Return only recurring reminders, excluding one-time planned transactions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint, idempotentHint, and destructiveHint, which cover safety. The description adds context about what reminders include (planned/recurring transactions) but does not mention any additional behavior such as sorting or pagination, which is acceptable given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and provides necessary detail without excessive verbosity. It is well-structured, though the phrase 'pairs a schedule with the transaction' is slightly redundant with the earlier definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for an agent to understand the tool's purpose and parameter usage. It does not need to explain return values since an output schema is present, and no hidden side effects or edge cases are left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema descriptions cover all three parameters (type, limit, recurringOnly) at 100% coverage, and the tool description reinforces their meaning. The agent has full clarity on how each parameter affects the result.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool lists reminders and specifies the resource. It distinguishes the intent from sibling tools (list_accounts, list_budgets, etc.) by focusing on reminders and their schedule/transaction pairing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains parameter usage ('Use recurringOnly to exclude...' and 'type to filter...') but does not explicitly say when to choose this tool over alternatives. Sibling tools are obviously different resources, so the gap is moderate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_transactionsList transactionsARead-onlyIdempotent
List transactions for a given date range. Supports filtering by account, category, and type (income/expense/transfer). Returns at most limit results ordered by date descending.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by transaction type. | |
| limit | No | Maximum number of transactions to return. | |
| endDate | Yes | End date (YYYY-MM-DD), inclusive. | |
| accountId | No | Filter by account ID (use list_accounts to find IDs). | |
| startDate | Yes | Start date (YYYY-MM-DD), inclusive. | |
| categoryId | No | Filter by category (tag) ID (use list_categories to find IDs). |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation read-only, idempotent, and non-destructive. The description adds useful behavioral details beyond those annotations: it caps results at `limit` and orders them by date descending. This is sufficient for an agent to predict the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences convey the core operation, supported filters, result cap, and ordering with no filler. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich input schema, a full output schema, and strong annotations, the description covers everything an agent needs: date range, filter dimensions, limit behavior, and ordering. No critical calling context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema. The description adds a concise summary of filter options and the ordering behavior, but it does not materially expand on the parameter semantics already present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a specific resource ('transactions'), and the core scope (date range), which cleanly separates it from sibling tools like list_accounts and create_transaction. The mention of supported filters further clarifies what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use the tool: whenever transactions for a date range are needed, with optional filters. It does not explicitly name alternatives or exclusions, but the sibling set contains no competing list-transactions tool, so the intended usage is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
create_transaction - First observed
invalidate_cache - First observed
list_accounts - First observed
list_budgets - First observed
list_categories - First observed
list_merchants - First observed
list_reminders - First observed
list_transactions
TDQS
Scored across 8 tools
Each tool has a distinct purpose: listing accounts, budgets, categories, merchants, reminders, transactions, creating transactions, and invalidating cache. No overlap or ambiguity.
All tools follow a clear verb_noun pattern (list_*, create_*, invalidate_cache) with consistent lowercase snake_case naming.
8 tools is a well-scoped set for a read-heavy financial data server with one mutation and a cache control tool. No redundancy or excessive number.
Core read operations and transaction creation are covered, but update/delete operations for transactions or other entities are missing. However, given the server's apparent read-oriented purpose, this is a minor gap.
Maintenance
Related MCP Connectors
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Query your real net worth, spending, transactions, budgets and portfolio from any MCP client.
MCP server for Pinchwork - an agent-to-agent task marketplace with credits-based economy
MCP server for Modern Treasury — payment orders, transactions, counterparties and ledgers.
Related MCP Servers
- AlicenseBqualityAmaintenanceMCP Server for Monarch Money, utilizing an unofficial api.11393MIT
- AlicenseAqualityAmaintenanceAn MCP server implementation that provides programmatic access to personal finance data through LunchMoney's API, enabling AI assistants to manage transactions, budgets, categories, and assets.5910,833 npm107MIT
- AlicenseCqualityBmaintenanceUnofficial MCP server for Monarch Money that exposes tools for managing accounts, transactions, budgets, and other financial data through natural language.1251MIT
- AlicenseBqualityCmaintenanceRead-only MCP server for ZenMoney that syncs financial data into memory and exposes it through tools and resources, enabling agentic analysis of transactions and spending patterns.1023 npmMIT