Copilot Money
NPM · COPILOT-MONEY-MCP
Query and manage Copilot Money personal finances — local reads, opt-in GraphQL writes.
Available components
Last scanned (17 hours ago)
Scores higher than 96% of npm servers
Category Finance and Payments
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 38 of 104 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to ignaciohermosillacornejo/copilot-money-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 9 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability62
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 4616 tokens (~329/item across 14 items; 14 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 14 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 2 Nov 26 +1
- Stability: 0.97 → pass security
- 1 Nov 26 −1
- Stability: pass → 0.97 functional
- 30 Oct 26 +1
- Security disclosure: unverified → pass ▲ functional
- 29 Oct 26 −1
- Security disclosure: pass → unverified ▼ functional
- 26 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- Malware indicator (automated code analysis) cleared ▲ security
- Malware indicator (automated code analysis) cleared ▲ security
- 25 Oct 26 −2
- Malware scan: fail → unverified ▼ security
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Schema quality: 206 → 329 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Security disclosure: pass → unverified ▼ functional
- Package version: 2.3.0 → 3.0.0 functional
- 20 Oct 26 0
- Stability: 0.97 → pass security
- 19 Oct 26 0
- Security disclosure: unverified → pass ▲ functional
- Stability: pass → 0.97 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed npm/copilot-money-mcp@3.0.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | ignaciohermosillacornejo/copilot-money-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/ignaciohermosillacornejo/copilot-money-mcp/.github/workflows/npm-publish.yml@refs/heads/main |
| Rekor log index | 3469667446 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:0ebc18916f9104fa9ba732e89d4654a44e2680fa96fbe50c1c7fb3d12762e7e7b3ca924549927a2ddb15d7f362b7da3f22bcaba7b0864e7a90416d36a |
Background: How many MCP packages publish verified provenance →
Dependencies 104 packages
| Packages resolved | 104 |
|---|---|
| Stale | 38 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
get_accounts ~552
Get 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_balance, institution_name, iso_currency_code, item_id, plus user_hidden / user_deleted when set (the flags include_hidden controls). That drops the other ~35 document fields. PARTIAL list of what goes, not exhaustive: the embedded `holdings` array (get_holdings covers it), institution `logo` images plus their `logo_content_type` (base64-encoded, several KB each — this PAIR is where the removed include_logos flag went, and the flag gated both, so request them together), `mask` (the last-4 digits humans identify an account by), `available_balance`, `limit`, `institution_id`, `creation_timestamp` (when the account was created in Copilot, YYYY-MM-DD — written only on newer rows, so absent means unknown, not old), the denormalized `official_name` / `original_*` name dupes, and `user_id`. Any document field is requestable by name: fields: ["default", "mask", "available_balance"], or "all" / "*" for full rows. `include_logos` was removed in v3.0.0 — passing it now raises an error naming this migration.
| Name | Type | Req | Description |
|---|---|---|---|
| account_type | string | – | Filter by account type (checking, savings, credit, loan, investment, depository). Note: summary totals (total_assets, total_liabilities, total_balance) reflect only the filtered subset. |
| fields | array | – | Return only these fields per account row (e.g. ["account_id", "name", "current_balance"] for get_accounts, or ["id", "name", "balance"] for get_accounts_live — field names differ between the two mode… |
| include_hidden | boolean | – | Include hidden accounts (default: false) |
No output schema declared.
No examples provided.
get_balance_history ~217
Get 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.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | – | Filter by account ID |
| end_date | string | – | End date (YYYY-MM-DD) |
| granularity | string | yes | Required. Controls response density: daily (every day), weekly (one per week), or monthly (one per month). Use weekly or monthly for longer time ranges. |
| limit | integer | – | Maximum number of results (default: 100, max: 10000) |
| offset | integer | – | Number of results to skip for pagination (default: 0) |
| start_date | string | – | Start date (YYYY-MM-DD) |
No output schema declared.
No examples provided.
get_budgets ~99
Get 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.
| Name | Type | Req | Description |
|---|---|---|---|
| active_only | boolean | – | Only return active budgets (default: false) |
No output schema declared.
No examples provided.
get_cache_info ~86
Get 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).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_categories ~238
Unified 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).
| Name | Type | Req | Description |
|---|---|---|---|
| end_date | string | – | End date for list view (YYYY-MM-DD format) |
| parent_id | string | – | Get subcategories of this parent category ID |
| period | string | – | Time period for list view (e.g., 'this_month', 'last_month', 'last_30_days', 'this_year'). Takes precedence over start_date/end_date if provided. |
| query | string | – | Search query (required for 'search' view) |
| start_date | string | – | Start date for list view (YYYY-MM-DD format) |
| view | string | – | View mode: list (categories with spend totals), tree (parent/child hierarchy), search (find by keyword) |
No output schema declared.
No examples provided.
get_connection_status ~140
Get 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 installed. Only "fail" means the API drifted; "auth-missing" and "incomplete" mean drift is unknown.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_goal_history ~171
Get 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.
| Name | Type | Req | Description |
|---|---|---|---|
| end_month | string | – | End month (YYYY-MM) |
| goal_id | string | – | Filter by goal ID |
| limit | integer | – | Maximum number of results (default: 100, max: 10000) |
| offset | integer | – | Number of results to skip for pagination (default: 0) |
| start_month | string | – | Start month (YYYY-MM) |
No output schema declared.
No examples provided.
get_goals ~128
Get 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.
| Name | Type | Req | Description |
|---|---|---|---|
| active_only | boolean | – | Only return active goals (default: false) |
No output schema declared.
No examples provided.
get_holdings ~340
Get 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 investment balance; with --live-reads use get_investment_balance_live for the total.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | – | Filter by investment account ID. Returns empty for a hidden or merged account unless include_hidden is also set. |
| include_hidden | boolean | – | Include positions on hidden and merged accounts (default: false). Same flag, same default as get_accounts — leave it off and the two tools agree on which accounts exist. |
| include_history | boolean | – | Include monthly price/quantity snapshots per holding (default: false) |
| limit | integer | – | Maximum number of results (default: 100, max: 10000) |
| offset | integer | – | Number of results to skip for pagination (default: 0) |
| ticker_symbol | string | – | Filter by ticker symbol, case-insensitive (e.g., "AAPL", "SCHX"). The cash sleeve is CUR:USD here and USD in live mode; either spelling matches it in both modes (CUR:USD matches only cash; a bare USD… |
No output schema declared.
No examples provided.
get_investment_prices ~374
Get 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.
| Name | Type | Req | Description |
|---|---|---|---|
| end_date | string | – | End date (YYYY-MM-DD) |
| fields | array | – | Return only these fields per row. Default when omitted: a terse row (security_id, ticker_symbol, price_type, date/month, latest_price, latest_at). The full intraday/daily series lives in `prices`, wh… |
| limit | integer | – | Maximum number of results (default: 100, max: 10000) |
| offset | integer | – | Number of results to skip for pagination (default: 0) |
| price_type | string | – | Filter by price type: daily (monthly aggregates) or hf (high-frequency intraday) |
| start_date | string | – | Start date (YYYY-MM-DD) |
| ticker_symbol | string | – | Filter by ticker symbol (e.g., "AAPL", "BTC-USD", "VTSAX") |
No output schema declared.
No examples provided.
get_investment_splits ~284
Get 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 apply these multipliers to the prices yourself. Securities that have never split are not included in the output. Coverage is limited to securities Copilot currently syncs in your local cache (typically currently-held or recently-held).
| Name | Type | Req | Description |
|---|---|---|---|
| end_date | string | – | Optional. Inclusive upper bound on effective_date (YYYY-MM-DD). |
| limit | integer | – | Maximum number of rows. Default 100, max 10000. |
| offset | integer | – | Pagination offset, default 0. |
| start_date | string | – | Optional. Inclusive lower bound on effective_date (YYYY-MM-DD). |
| ticker_symbol | string | – | Optional. Case-insensitive ticker filter (e.g. "NVDA"). |
No output schema declared.
No examples provided.
get_recurring_transactions ~482
Identify 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. That excludes the matched `transactions` array (already reachable via get_transactions) and `confidence_reason` (prose explaining the score) — see `fields` for how to get either back.
| Name | Type | Req | Description |
|---|---|---|---|
| end_date | string | – | End date (YYYY-MM-DD) |
| fields | array | – | Return only these fields per detected recurring merchant. Default when omitted omits two expensive fields: `transactions` (the matched date/amount pairs, ~29% of a row) and `confidence_reason` (prose… |
| include_copilot_subscriptions | boolean | – | Include Copilot's native subscription tracking data (default: true). Returns copilot_subscriptions array with user-confirmed subscriptions. |
| min_occurrences | integer | – | Minimum number of occurrences to qualify as recurring (default: 2) |
| name | string | – | Filter by name (case-insensitive partial match). When filtering, returns detailed view with additional fields like min_amount, max_amount, match_string, account info, and transaction history. |
| period | string | – | Period to analyze (default: last_90_days). Options: this_month, last_month, last_7_days, last_30_days, last_90_days, ytd, this_year, last_year |
| recurring_id | string | – | Filter by exact recurring ID. When filtering, returns detailed view with additional fields like min_amount, max_amount, match_string, account info, and transaction history. |
| start_date | string | – | Start date (YYYY-MM-DD) |
No output schema declared.
No examples provided.
get_transactions ~1,434
Reads from the local LevelDB cache, which may lag behind Copilot's server if the macOS app hasn't synced recently. For real-time data use --live-reads with `get_transactions_live`. Unified transaction retrieval tool. Supports multiple modes: (1) Filter-based: Use period, date range, category, merchant, amount filters. (2) Single lookup: Provide transaction_id to get one transaction. (3) Text search: Use query for free-text merchant search. (4) Special types: Use transaction_type for foreign, refunds, credits, duplicates, hsa_eligible, tagged. (5) Location-based: Use city or lat/lon with radius_km. (6) Tag filter: Use tag to find transactions with a specific tag. Rows are TERSE by default: transaction_id, date, amount, name, category_name, account_id, item_id, pending, excluded, internal_transfer. `excluded` answers "is this row excluded from spending?" — the raw per-transaction flag OR the row's category being user-excluded, the same union exclude_excluded filters on — so it is true for a row Copilot never stamped individually. It is therefore nearly always false in a default response, since exclude_excluded already removed those rows; it carries information only when you pass exclude_excluded: false. A cache row carries ~30 fields and most callers need a handful, so the rest are excluded unless asked for. PARTIAL list of what that drops, not exhaustive: Plaid metadata (plaid_category_id, plaid_category_strings, plaid_deleted), internal IDs (category_id, recurring_id, goal_id, parent_transaction_id, children_transaction_ids, user_id), enrichment and intelligence fields (normalized_merchant — still the normalized merchant name when requested — intelligence_suggested_category_ids, suggestion_ids, original_name), tag_ids, review state (user_reviewed, user_note, user_changed_type — true only when a human re-typed the row, so do not second-guess its type), location (city, region, country, lat/lon), and flags like is_amazon/from_investment. `amazon` is worth naming becau…
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | – | Filter by account ID |
| category | string | – | Filter by category ID from get_categories (exact match, not a name). A parent category's id also returns its subcategories' rows. An id that belongs to no category and to no transaction the call look… |
| city | string | – | Filter by city name (partial match) |
| country | string | – | Filter by country code (e.g., US, CL) |
| end_date | string | – | End date (YYYY-MM-DD) |
| exclude_deleted | boolean | – | Exclude deleted transactions marked by Plaid (default: true) |
| exclude_excluded | boolean | – | Exclude user-excluded transactions (default: true) |
| exclude_split_parents | boolean | – | Exclude split-transaction parents (docs with children_transaction_ids). The children already carry the real categorized amounts — returning the parent would double-count the spend. Default: true. |
| exclude_transfers | boolean | – | Exclude transfers between accounts and credit card payments (default: true) |
| fields | array | – | Return only these fields per transaction. Default when omitted: a terse row (transaction_id, date, amount, name, category_name, account_id, item_id, pending, excluded, internal_transfer). Anything el… |
| lat | number | – | Latitude for proximity search (use with lon and radius_km) |
| limit | integer | – | Maximum number of results (default: 100) |
| lon | number | – | Longitude for proximity search (use with lat and radius_km) |
| max_amount | number | – | Maximum transaction amount |
| merchant | string | – | Filter by merchant name (case-insensitive substring) |
| min_amount | number | – | Minimum transaction amount |
| offset | integer | – | Number of results to skip for pagination (default: 0) |
| pending | boolean | – | Filter by pending status (true for pending only, false for settled only) |
| period | string | – | Period shorthand: this_month, last_month, last_7_days, last_30_days, last_90_days, ytd, this_year, last_year |
| query | string | – | Free-text search in merchant/transaction names |
| radius_km | number | – | Search radius in kilometers (default: 10) |
| region | string | – | Filter by region/city (case-insensitive substring) |
| start_date | string | – | Start date (YYYY-MM-DD) |
| tag | string | – | Filter by tag name (e.g. "vacation") |
| transaction_id | string | – | Get a single transaction by ID (ignores other filters, though a `category` value must still be a real id) |
| transaction_type | string | – | Filter by special type. Cache-only: foreign (international) and duplicates (potential duplicate transactions, paired among the rows the other filters keep; pass the matching exclude_*: false, e.g. ex… |
No output schema declared.
No examples provided.
refresh_database ~71
Refresh 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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
How do I install the Copilot Money MCP server?
Copilot Money runs locally as an npm package, launched with npx -y copilot-money-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · copilot-money-mcp
claude mcp add ignaciohermosillacornejo-copilot-money-mcp -- npx -y copilot-money-mcp
What is the Copilot Money MCP server?
Copilot Money is an MCP server listed in the public MCP registry as io.github.ignaciohermosillacornejo/copilot-money-mcp. Query and manage Copilot Money personal finances, local reads, opt-in GraphQL writes. This page covers its npm package (copilot-money-mcp).
Is the Copilot Money MCP server safe to use?
Copilot Money scores 93 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Copilot Money MCP server expose?
Copilot Money exposes 14 tools: get_transactions, get_cache_info, refresh_database, get_accounts, get_connection_status, and 9 more. Their descriptions and schemas cost roughly 4,616 tokens of context every time the server is loaded.
Is the Copilot Money MCP server still maintained?
Copilot Money is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Copilot Money MCP server under?
Copilot Money declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.