Copilot Money
Query and manage Copilot Money personal finances — local reads, opt-in GraphQL writes.
Connector by ignaciohermosillacornejo · GitHub account verified by the MCP Registry
Chalk Labs
Need help deploying Copilot Money?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/ignaciohermosillacornejo-copilot-money-mcp
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: finance-accounting
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 25, 2026.
- Tools
- 31 read · 14 write · 5 delete
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Node.js package
Tools by what they do 50
Read from the source code; the running server may list different tools.
Read 31 · Look things up without changing anything.
get_accountsget_accounts_liveget_aggregated_holdings_liveget_balance_historyget_balance_history_liveget_budgetsget_budgets_liveget_cache_infoget_categoriesget_categories_liveget_connection_statusget_goal_history
Show 19 more tools
get_goalsget_holdingsget_holdings_liveget_investment_allocation_liveget_investment_balance_liveget_investment_pricesget_investment_prices_liveget_investment_splitsget_monthly_spend_liveget_networth_liveget_recurring_liveget_recurring_transactionsget_tags_liveget_top_movers_liveget_transactionsget_transactions_liveget_upcoming_recurrings_liverefresh_cacherefresh_database
Write 14 · Create, change, send or run things.
add_transaction_to_recurringbulk_edit_transactionscreate_categorycreate_recurringcreate_tagcreate_transactionreview_transactionsset_budgetset_recurring_stateupdate_categoryupdate_recurringupdate_tag
Show 2 more tools
update_transactionupdate_transactions
Delete 5 · Delete, drop, revoke or wipe things.
delete_categorydelete_recurringdelete_tagdelete_transactionsplit_transaction
Network hosts it talks to 4
app.copilot.money· found in codeapple.com· found in codegithub.com· found in codesecuretoken.googleapis.com· found in code
Files it touches
~/.claude/copilot-money/user-profile.md/dev/null- Your home directory (~)
Tools (50)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
add_transaction_to_recurringManually link an existing transaction to an existing recurring series. Use this when Copilot's auto-detection missed a rent/subscription/etc. charge that should be grouped with a recurring. All four IDs are required (transaction_id, account_id, item_id, recurring_id). The transaction must already exist — create_transaction followed by add_transaction_to_recurring is the manual flow. Refuses a known split parent (or when unchecked). Copilot also sets the row's category to the recurring's. Returns the updated transaction with its `recurring_id` and `category_id`; the row uses get_transactions_li…
bulk_edit_transactionsApply the SAME edit to MANY transactions in ONE request — Copilot's native bulk-edit endpoint (the one its multi-select UI uses) — e.g. recategorizing a merchant, tagging a trip, marking a batch reviewed. Targets: `transaction_ids` (resolved locally) or `rows` (from a live read; works out-of-window); `rows` wins if both are given. Requires at least one of category_id, type, reviewed, add_tag_ids, remove_tag_ids — Copilot bulk-edits ONLY these five fields. For different values per target, or name/note/date/amount edits, use update_transactions instead. Tags are add/remove only, never replace (t…
create_categoryCreate a new custom category in Copilot Money. Provide name, color_name, and emoji (all required). Optionally set is_excluded. Returns the generated category_id. The new category can then be used with update_transaction. Note: parent/child category hierarchies are not writable through Copilot's GraphQL API — create flat categories only. Writes directly to Copilot Money via GraphQL.
create_recurringCreate a new recurring/subscription item by seeding it from an existing transaction. The recurring inherits its merchant name, account, and initial amount from that transaction; you only supply the cadence (frequency). If the seed transaction cannot be resolved locally (outside the resolution window), pass account_id and item_id (from a live read) to create the recurring anyway. Refuses a known split parent (or when unchecked). Writes directly to Copilot Money via GraphQL.
create_tagCreate a new user-defined tag for categorizing transactions. Tags appear in the Copilot Money app and are stored in the tag_ids field on transactions. Optionally set a color. Writes directly to Copilot Money via GraphQL.
create_transactionCreate a brand-new manual transaction on an existing account. Requires account_id, item_id, name, date, amount, and type; category_id required for REGULAR, omit for INCOME/INTERNAL_TRANSFER. Optional tag_ids, note, and recurring_id. Formats, sign convention, and ID sources are documented per parameter. Returns the new transaction as a get_transactions_live row, minus category_name and excluded (the note field is `user_notes`). On a manual account, a row dated before the account's last balance reset does not move its balance.
delete_categorycan change or delete dataDelete a user-defined category. The category_id can be obtained from get_categories. Writes directly to Copilot Money via GraphQL.
delete_recurringcan change or delete dataDelete a recurring item (subscription/charge). Requires recurring_id (from get_recurring_transactions). Writes directly to Copilot Money via GraphQL.
delete_tagcan change or delete dataDelete a user-defined tag. The tag_id can be obtained from the tag definitions in the local cache. Writes directly to Copilot Money via GraphQL.
delete_transactioncan change or delete data**DESTRUCTIVE**: Permanently deletes a transaction from Copilot Money. There is no soft-delete and no undo. All three IDs (transaction_id, account_id, item_id) are required — no id lookups — so a typo in one field returns 'Transaction not found' rather than silently deleting a different transaction. Refuses a known split parent, even a childless one that looks ordinary: Copilot would credit its amount back twice, leaving the balance wrong — delete its children instead. The source account may re-add Plaid rows on its next sync, without user metadata (category, tags, notes, reviewed, goal, split…
get_accountsread-onlyGet all accounts with balances, plus summary fields: total_balance (net worth = assets minus liabilities), total_assets, and total_liabilities. Optionally filter by account type (checking, savings, credit, investment). Checks both account_type and subtype fields for better filtering (e.g., finds checking accounts even when account_type is 'depository'). By default, hidden accounts are excluded. `name` is your Copilot nickname when set, else the provider label — it is user-editable, so key on account_id, never on name. Default rows are terse: account_id, name, account_type, subtype, current_bal…
get_accounts_liveread-onlyGet all linked financial accounts (live, GraphQL-backed). Returns balances and metadata. Replaces get_accounts when --live-reads is on. `name` is your Copilot nickname when set, else the provider label — it is user-editable, so key on id, never on name. Default rows are terse: id, name, type, subType, balance, institutionId, itemId, isUserHidden, isUserClosed (the last two are the flags include_hidden controls). That EXCLUDES sync/plumbing fields — `hasHistoricalUpdates`, `hasLiveBalance`, `liveBalance`, `latestBalanceUpdate`, `isManual` — which describe Plaid sync state rather than the accoun…
get_aggregated_holdings_liveread-onlyGet per-security aggregated holdings (live, GraphQL-backed). One row per security, collapsing all your accounts: `value` (current market value of the position, in dollars) and `change` (how much that value moved over the selected `time_frame`, in dollars). Distinct from get_holdings_live, which is per (account, security) with cost basis. Optional `account_id` / `item_id` scope the aggregation to a single account (server-side). Available when --live-reads is on.
get_balance_historyread-onlyGet daily balance snapshots for accounts over time. Each entry returns current_balance, available_balance, limit, account_id, and account_name. The response also includes an `accounts` array listing the distinct account IDs in the paginated page. Requires a granularity parameter (daily, weekly, monthly) to control response size. Weekly and monthly modes downsample by keeping the last data point per period. Filter by account_id and date range.
get_balance_history_liveread-onlyGet daily balance history for a single account (live, GraphQL-backed). Requires both item_id and account_id (server constraint — one account per call). Date range is selected by the time_frame enum; the server returns daily granularity and no name/limit enrichment. For cross-account history or weekly/monthly downsampling, use cache-mode `get_balance_history`. Use `get_accounts_live` to enumerate (item_id, account_id) pairs. Long-range responses are paginated via `max_rows` (default 500, max 5000) and `offset` (counts from the most-recent end); `total_rows` and `truncated` indicate whether olde…
Show 35 more tools
get_budgetsread-onlyGet budgets from Copilot's native budget tracking. Returns the current-month effective budget per category plus the full `amounts` map of per-month overrides for history lookups. For parent categories, the returned `amount` is the resolved total (children + rollovers) that Copilot displays in the Budgets view. Totals use the current-month effective amount.
get_budgets_liveread-onlyGet budgets from Copilot's native budget tracking (live, GraphQL-backed). Projects per-category budgets from the categories cache — the same fetch that powers get_categories_live populates this. Replaces get_budgets when --live-reads is on. Note: live mode does not include `name`, `period`, `start_date`, `end_date`, `is_active`, or `iso_currency_code` per budget — those fields aren't exposed on Copilot's GraphQL endpoint. Use cache-mode `get_budgets` if you need them. `amount` includes rollover; 0 can mean no budget (cleared and never set read the same); an excluded category has none.
get_cache_inforead-onlyGet information about the local data cache, including the date range of cached transactions and total count. Useful for understanding data availability before running historical queries. This tool reads from a local cache that may not contain your complete transaction history. Also reports decode_health: per-collection counts of documents dropped on schema validation failure (a "degraded" status means some cached documents are missing from results).
get_categoriesread-onlyUnified category retrieval tool. Supports multiple views: list (default) - user categories with transaction counts/amounts for a time period; tree - user categories as hierarchical tree; search - search user categories by keyword. Use parent_id to get subcategories. For list view, use period (e.g., "this_month") or start_date/end_date to filter by date. Includes all categories, even those with $0 spent (matching UI behavior).
get_categories_liveread-onlyGet user categories (live, GraphQL-backed), including each category id, parentId, and a derived `budget_amount`. IMPORTANT: `budget_amount` is the BUDGETED amount for the month — NOT the amount spent. It includes rollover, so can exceed the amount set; 0 can mean no budget (cleared and never set read the same); null when the category has no budget object (e.g. excluded). To find actual spending in a category, call get_transactions_live with that category id and sum the transaction amounts; do not report the budget as spend. The budget data here is the same cache get_budgets_live reads from. Ea…
get_connection_statusread-onlyGet connection status for all linked financial institutions. Shows per-institution sync health including last successful update timestamps for transactions and investments, login requirements, and error states. Use this to check when accounts were last synced or to identify connections needing attention. Also reports decode_health: per-collection counts of cached documents dropped on schema validation failure (a "degraded" status means some documents are missing from results). Also reports scheduled_smoke: the last scheduled API-drift check with timestamp, or null if the weekly job is not inst…
get_goal_historyread-onlyGet monthly progress snapshots for financial goals. Returns current_amount, target_amount, daily data points, and contribution records per month. Filter by goal_id or month range (YYYY-MM). Cache-only: no live-mode (`--live-reads`) counterpart exists because Copilot's GraphQL endpoint does not expose goal data, so this tool always returns cached LevelDB data regardless of the `--live-reads` flag.
get_goalsread-onlyGet financial goals from Copilot's native goal tracking. Retrieves user-defined savings goals, debt payoff targets, and investment goals. Returns goal details including target amounts, monthly contributions, status (active/paused), start dates, and tracking configuration. Calculates total target amount across all goals. Cache-only: no live-mode (`--live-reads`) counterpart exists because Copilot's GraphQL endpoint does not expose goal data, so this tool always returns cached LevelDB data regardless of the `--live-reads` flag.
get_holdingsread-onlyGet current investment holdings with position-level detail. Returns ticker, name, quantity, current price, equity value, average cost, and total return per holding. Joins data from account holdings, securities, and optionally historical snapshots. Filter by account or ticker symbol. Note: cost_basis may be unavailable for cash-equivalent positions. Positions on hidden and merged accounts are EXCLUDED by default, matching get_accounts — pass include_hidden: true for them. Do NOT sum holdings as portfolio value: unvested stock-plan shares are reported as holdings, so the sum can far exceed the i…
get_holdings_liveread-onlyGet investment positions with cost-basis metrics (live, GraphQL-backed). One row per (account, security). For CASH sleeves and other positions where the server returns no cost-basis metrics, the four derived fields (cost_basis, average_cost, total_return, total_return_percent) are omitted from the row; check `is_cash_equivalent` (derived from `security.type === 'CASH'`) to distinguish. For monthly snapshots, use cache-mode `get_holdings` with `include_history: true` — history is not available on the live query. Positions on hidden and closed accounts are EXCLUDED by default, matching get_accou…
get_investment_allocation_liveread-onlyGet the portfolio asset-class allocation (live, GraphQL-backed). Returns one row per asset class — `type` (e.g. "EQUITY", "CASH", "FIXED_INCOME"), `amount` (dollar value), and `percentage` (share of total invested as a percent, 0–100). Optional `account_id` / `item_id` scope the allocation to a single account (applied server-side). Available when --live-reads is on.
get_investment_balance_liveread-onlyGet your investments-only combined balance (live, GraphQL-backed): `current` (the current-moment combined investment-accounts balance — the "live dot") and `history` (a daily timeseries over the selected `time_frame`, ascending by date; each point is `{date, balance}` in dollars). Investments-only — distinct from get_networth_live (whole net worth) and get_balance_history_live (per-account). The history cache holds the most-recently-requested time_frame; requesting a different value refetches it. `history` is capped to the most recent `history_limit` points (default 30) — see that param to fet…
get_investment_pricesread-onlyGet investment price history for portfolio tracking. Returns one row per (security, period) for stocks, ETFs, mutual funds, and crypto. Filter by ticker symbol, date range, or price type (daily/hf). By default each row is TERSE: the security, the period, and its latest price (`latest_price` / `latest_at`) — enough to answer "what is this worth". The full price series (`prices`, an epoch-millis map) is most of a full row and roughly quadruples response size, so it is omitted unless requested via `fields`; ask for it only when you need the time series itself, not a current value.
get_investment_prices_liveread-onlyGet price history for a single security (live, GraphQL-backed). time_frame picks the query: ONE_DAY and ONE_WEEK return intraday timestamps (5-minute cache TTL); ONE_MONTH / THREE_MONTHS / YTD / ONE_YEAR / ALL return daily closes (1-hour TTL). The output `granularity` field says which row field to use (`date` daily, `timestamp` intraday). Server-side ownership gate: only securities you currently hold work — any other security_id returns a clean "not currently in your linked accounts" error; enumerate valid ids via get_holdings_live. Long ranges paginate via `max_rows` and `offset`; the respons…
get_investment_splitsread-onlyGet stock split events from the local Firestore cache. Returns one row per (security, effective_date) with the adjustment multiplier (e.g. 0.1 for a 10-for-1 split — multiply pre-split prices/quantities by this value to convert to the post-split equivalent). Joined with the securities collection so each row includes ticker and name. IMPORTANT: prices returned by `get_investment_prices` and `get_investment_prices_live` are ALREADY split-adjusted by Copilot. Use this tool only when you need the split events themselves (e.g., for narrative or historical-analysis purposes) — you do NOT need to app…
get_monthly_spend_liveread-onlyCurrent month's NON-RECURRING spend, day by day (live). `total_amount` is CUMULATIVE month-to-date; `daily_amount` is that day's increase (the first row's, its own total). Counts REGULAR transactions with no recurring link, net of refunds, pending included; leaves out income, transfers, recurring charges (rent, subscriptions) and UNCATEGORIZED rows, so it is NOT the app's "spent this month" — for that, follow the spend recipe in get_transactions_live's description. On the latest row, `comparison_amount` matched the Dashboard's "$N under" budget figure (one measurement, #844); it is not a "vs l…
get_networth_liveread-onlyGet net-worth-over-time history (live, GraphQL-backed). Returns daily snapshots sorted oldest→newest by date; for each row, `assets - debt` gives the net worth at that point in time. Both `assets` and `debt` are nullable numbers — early dates in the user's history may have `assets: null` until backfilled. Available when --live-reads is on. Optional `time_frame` arg (default "YTD"; accepts the canonical TimeFrame values "ONE_DAY", "ONE_WEEK", "ONE_MONTH", "THREE_MONTHS", "YTD", "ONE_YEAR", "ALL"). The cache holds the most-recently-requested time_frame; requesting a different value triggers a fr…
get_recurring_liveread-onlyGet user-confirmed recurring/subscription items (live, GraphQL-backed). Replaces get_recurring_transactions when --live-reads is on. NOTE: pattern-based detection from transactions is NOT included — only Copilot's native subscription tracking. Run without --live-reads if you need pattern detection. Each row carries a `category_name` resolved from the categories list (loaded on first use); `null` when the row has no category or its category was deleted, and on every row if the categories read fails, which `_category_warning` then reports. Default rows are terse: id, name, state, frequency, next…
get_recurring_transactionsread-onlyIdentify recurring/subscription charges. Combines two data sources: (1) Pattern analysis - finds transactions from same merchant with similar amounts, returns estimated frequency, confidence score, and next expected date. (2) Copilot's native subscription tracking - returns user-confirmed subscriptions stored in the app. Both sources are included by default for comprehensive coverage. Rows in the pattern-analysis `recurring` array are terse by default: merchant, normalized_merchant, occurrences, average_amount, total_amount, frequency, confidence, category_name, last_date, next_expected_date. …
get_tags_liveread-onlyGet all user tags (live, GraphQL-backed). Each row carries `id`, `name`, and `color`. No cache-mode counterpart exists — this tool is the only way to enumerate tags. Use this to enumerate tag IDs before calling `get_transactions_live` with a tag filter, or to enrich transaction-tag references with human-readable names. Available when --live-reads is on.
get_top_movers_liveread-onlyGet the biggest movers across your investment holdings (live, GraphQL-backed). One row per security with an aggregate `change` (the ranked metric in the requested filter's units — dollars for MY_EQUITY_CHANGE, raw security price change for PRICE_CHANGE). Default rows are terse (security_id, ticker_symbol, name, type, change) — the intraday `price_points` series (`{timestamp, price}`; `timestamp` is epoch milliseconds) is opt-in via `fields`. The `filter` selects the ranking basis: "MY_EQUITY_CHANGE" (default — dollar impact on your position, price change weighted by held quantity) or "PRICE_CH…
get_transactionsread-onlyDescription is built at runtime.
get_transactions_liveread-onlyDescription is built at runtime.
get_upcoming_recurrings_liveread-onlyGet the next-due recurring/subscription items — the "about to bill" view (live, GraphQL-backed). Returns unpaid upcoming payments sorted by due date (soonest first). HORIZON (unverified, #844, parity row REC-07): one read returned only rows due within about 14 days, with most configured recurrings absent, so do not treat this as "every bill left this month"; for bills due later, use get_recurring_live's nextPaymentDate. DISTINCT from `get_recurring_live`, which returns the full set of configured/historical recurrings; use this tool when the user asks "what's coming up" or "what bills am I abou…
refresh_cacheread-onlyFlush the in-memory live cache by scope. Use when the user explicitly wants fresh data despite TTLs. Does not touch LevelDB (use refresh_database for that). Live-reads mode only.
refresh_databaseread-onlyRefresh the in-memory cache by reloading data from the local Copilot Money database. Use this when the user has recently synced new transactions in the Copilot Money app, or when you suspect the cached data is stale. The cache also auto-refreshes every 5 minutes. Returns the updated cache info after refresh.
review_transactionsBulk mark transactions as reviewed (or unreviewed). Pass `transaction_ids` (resolved locally — works only within the resolution window) OR `rows` — an array of {transaction_id, account_id, item_id} from a live read that works for ANY transactions, including out-of-window backlog; prefer `rows` for large sweeps. One of the two is required; `rows` wins when both are given. The whole set is applied in ONE GraphQL request. If the server rejects or silently skips any row the call throws, naming the affected ids; `reviewed_count` reflects what actually landed.
set_budgetSet the monthly budget amount for a category. amount="0" clears the budget. Pass month="YYYY-MM" for a single-month override; omit for the all-months default. Note: if the user has disabled "Enable budgeting" or "Enable rollover" in Copilot → Settings → General, the budget write still succeeds on the server, but the value will not appear in the Copilot UI until those toggles are re-enabled. Rollover behavior also depends on the "Rollover categories" selection in the same settings pane, which is not writable through this tool. On an excluded category the write succeeds but reads hide the budget…
set_recurring_stateChange the state of a recurring item (subscription/charge). Set to ACTIVE, PAUSED, or ARCHIVED (uppercase, matching the GraphQL API). Requires recurring_id (from get_recurring_transactions). Writes directly to Copilot Money via GraphQL.
split_transactioncan change or delete dataSplit one parent transaction into 2+ child transactions (e.g. a 'Hotel + Car + Meals' charge into three per-category children). Requires the parent transaction_id, account_id, and item_id plus `splits` (min 2 entries; each needs `amount` and `category_id`; `name`/`date` default to the parent's). Child amounts must sum to the parent's amount — validated client-side and server-enforced. If the parent cannot be resolved locally (outside the resolution window), the split still proceeds when every entry carries explicit `name` and `date`; the sum check then defers to the server. On success the pare…
update_categoryUpdate an existing user-defined category. Provide category_id (required) and any fields to change: name, emoji, color_name, or is_excluded. Only the specified fields are updated. Note: parent/child category hierarchies are not writable through Copilot's GraphQL API. Writes directly to Copilot Money via GraphQL.
update_recurringUpdate an existing recurring transaction. Pass recurring_id plus at least one of name, category_id, frequency, state, or rule. Writes directly to Copilot Money via GraphQL.
update_tagUpdate an existing tag. Provide tag_id (required) and at least one of name or color_name. Only the specified fields are updated. Writes directly to Copilot Money via GraphQL.
update_transactionUpdate a single transaction. Pass transaction_id plus at least one of name, category_id, note, tag_ids, type, reviewed, date, or amount — only the fields you pass change. note="" clears the note; tag_ids=[] clears all tags. category_id cannot be combined with type INCOME or INTERNAL_TRANSFER (those clear the category server-side) — pass the type alone, or REGULAR to keep/set a category. amount/date/type edits of a known split parent (or when unchecked) are refused. If the transaction cannot be resolved locally (outside the resolution window), also pass account_id and item_id from a live read. …
update_transactionsApply many DIFFERENT transaction edits in ONE call — the per-row bulk form of update_transaction. Use it when rows need different values, or the edit touches name, note, date, or amount (Copilot cannot bulk-edit those four); for one IDENTICAL change to category/type/reviewed or a tag add/remove, prefer bulk_edit_transactions (ONE request instead of N). WARNING: an entry's tag_ids REPLACES that row's whole tag list, silently dropping existing tags — to add/remove a tag while keeping the rest, use bulk_edit_transactions add_tag_ids/remove_tag_ids. Entries are independent and take update_transact…
Signals
- Stars
- 85
- Forks
- 30
- Open issues
- 14
- Last commit
- Oct 21, 2026 (10 days ago)
- Last release
- Oct 25, 2026 (5 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.ignaciohermosillacornejo/copilot-money-mcp- Version
- 3.0.0
- Auth
- No auth
- Packages
- npm copilot-money-mcp
- License
- MIT
- First seen
- Oct 24, 2026
- Last checked
- Oct 26, 2026
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get Copilot Money running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
Copilot Money MCP server. Agent Mart. https://agentmart.dev/connectors/ignaciohermosillacornejo-copilot-money-mcp (last updated 2026-10-26)