longbook
NPM · @LONGBOOK/MCP · 2 COMPONENTS
Your longbook of bills, subscriptions and expenses, for your AI to read and to suggest changes to.
Available components
Last scanned (15 hours ago)
Scores higher than 36% 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 Security100
- 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
- No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency19
- Repository check failed: the declared repository URL returned HTTP 404. See how to fix → View diagnostics → Fail
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (GPL-3.0-only).Pass
- Actively maintained (last published 5 days ago).Pass
- Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability73
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 8011 tokens (~190/item across 42 items; 35 tools + 7 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 Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage78
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 35% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 37 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
- Supports UI / widget rendering.Pass
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
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.
- 14 Oct 26 +29
- Injection markers: unverified → pass ▲ security
- First check of Judged manipulation: pass security
- Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
- Tool coverage: unverified → 100 ▲ functional
- Schema quality: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- First check of Schema quality: fail functional
- First check of Schema quality: fail functional
- First check of Capabilities: pass functional
- First check of Tool coverage: 35 functional
- First check of Destructive annotations: 100 functional
- First check of Schema quality: good functional
- 12 Oct 26 0
- Package version: 1.40.2 → 1.40.4 functional
- 11 Oct 26 34
First indexed and scored.
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 18 Oct 2026 · Analysed npm/@longbook/mcp@1.40.4
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 0 packages
| Packages resolved | 0 |
|---|---|
| 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 →
accounts List accounts ~121
Every account the memory holds: id, name, type (its tag), institution and last4 when present, belongs_to (the person it belongs to), linked_to (the account it is linked to: a card to the bank account that pays it), balance with balance_date, notes — what is particular about it, one detail per line, a card's name ("Card name: …", the thing to look up for offers) among them — details as stored when it holds any, how many commitments and charges are billed to it, and its next unpaid charge.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
add_account Add an account ~458
Makes an account — a card, a bank account, UPI, a wallet, cash — with what is known: its type (`tag`, the app's own words: "credit card", "bank account"), the account it is linked to (`linked_to`, a card to the bank account that pays it, one level), the person it belongs to (`member`, someone the memory holds), its `notes` (one detail per line, such as a card's printed name as "Card name: Platinum Reserve"; numbers are refused) and a `balance` with the day it was true. A name another account already wears is refused rather than doubled; update_account changes one that exists. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| balance | number | – | What the account held on balance_date. |
| balance_date | string | – | The day the balance was true. Left out beside a balance, the day of the write is used. |
| linked_to | string | – | The account this one is linked to — a card to the bank account that pays it — by name or id. One level only. |
| member | string | – | The person the account belongs to, by name or id as the memory holds them. |
| name | string | yes | The display name — "Visa 9292", the last four digits at most. Refused when another account already wears it. |
| notes | string | – | What is particular about the account, one detail per line, each "Label: value" — on a card, "Card name: Platinum Reserve", the product printed on it; its number is refused. Rewritten as the account n… |
| source | string | – | – |
| tag | string | – | The account type, in the app's own words — "credit card", "bank account", "UPI", "wallet", "cash". |
No output schema declared.
No examples provided.
add_charges Add charges ~234
Writes rows into one commitment by date: a statement's months for a commitment that already exists (paid, basis "statement"), or more planned months than the app keeps. The app never grows a plan on its own, so this is how one grows. The commitment is named by id or the exact name as the memory holds it — a miss answers with the real names. A row already there for a day is updated in place, never doubled. An amount left out is the commitment's price. The answer carries balance_note when the account's balance is now older than the newest row written. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| charges | array | yes | – |
| id | string | – | – |
| name | string | – | – |
| source | string | – | – |
No output schema declared.
No examples provided.
add_commitments Add commitments ~339
Adds up to 200 commitments in one call, as one reviewable batch. A recurring row is planned from first_charge for plan_months (24 by default); a one-time row is its single charge on `date`. A statement line that is a charge is a one-time row at its real date and amount with paid: true and basis "statement". Money in — salary, a refund, interest, cashback, a dividend — is a one-time row with direction "in", paid, basis "statement", kept apart from spending. Movements between the owner's own accounts (card bill payments, ATM withdrawals, own transfers) are not charges; a row with direction "transfer" keeps one in view, shown and never summed. A member or account is named in words, and a new name becomes a placeholder row as the app would create it. A tag from the library (any casing) arrives with its icon. `notes` holds a row's three most important details, one per line, such as an insurance policy's number, its official name or its file in documents/. Where writes are proposals, rows can be promoted to recurring once the owner's app has applied the batch. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| rows | array | yes | – |
| source | string | – | – |
No output schema declared.
No examples provided.
add_member Add a person ~212
Makes a person with what is known — a `tag` for their role in the owner's finances (family, household help, landlord — the library's member tags first) and an `email`. A name another person already wears is refused rather than doubled; update_member changes one that exists. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| string | – | Where a shared report reaches them. | |
| name | string | yes | The name, as the owner said it. Refused when another person already wears it. |
| source | string | – | – |
| tag | string | – | Their role in the owner's finances — a member tag: family, household help, landlord. |
No output schema declared.
No examples provided.
cancel_commitment Cancel a commitment ~140
Cancels one commitment, by id or the exact name as the memory holds it — a miss answers with the real names. What was only planned after today is unwritten; what happened stays, so its past charges keep counting. Already-cancelled rows refuse. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
cashflow Monthly cash flow ~69
Monthly totals per currency, summed from the charges written: past months are the record, months ahead are the plan as written, a month with no rows is empty. Spending only — money in and transfers are in no month. Amounts are per-currency and never converted, blended, or amortised.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
charges List charges ~114
The rows themselves: every charge, or one commitment's, optionally inside a window or only paid / only unpaid — each with its amount, paid state, the day the money moved, what backs it, and its note. A charge behind today reads paid whatever its row says. Transfers are listed with direction "transfer" and summed apart, never in total; money in is read by naming its commitment. This is the ledger; nothing here is computed. Amounts are per-currency and never converted, blended, or amortised.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
commitments List commitments ~120
Every commitment with its attributes — price now, cycle, status, category, member, account — plus its next unpaid charge, how many charges it has, and how far it is planned. Plans running short are named. `active` is what still lies ahead: a one-time commitment whose charge is behind today or paid is a charge now, counted in settled_one_time and read with charges. direction flags money in ("in") and a movement between the owner's own accounts ("transfer"). Amounts are per-currency and never converted, blended, or amortised.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
create_report Create a report ~358
Asks longbook to draw a report from the ledger over the days and scope named. `title` is its name, `start_date` and `end_date` its first and last day (366 days at most, starting today or earlier), and `accounts`, `members` and `categories` narrow it — left out or empty means all. "No account" names charges billed to no account and "No category" untagged ones; any other name the memory does not hold is refused with the real names, and nothing is ever created. longbook draws the report on its Reports screen the next time the app is open, counting confirmed charges only; nothing waits in Changes. The same name, days and scope asked again redraws the same report.
| Name | Type | Req | Description |
|---|---|---|---|
| accounts | – | – | The accounts the report covers, or "No account" for charges billed to none, each by name as the memory holds it. Left out or empty: all of them. |
| categories | – | – | The categories the report covers, or "No category" for untagged charges, each by name as the memory holds it. Left out or empty: all of them. |
| end_date | string | yes | The last day covered, YYYY-MM-DD: on or after start_date, 366 days at most counting both. |
| members | – | – | The people the report covers, each by name as the memory holds it. Left out or empty: all of them. |
| source | string | – | – |
| start_date | string | yes | The first day covered, YYYY-MM-DD. Today or earlier. |
| title | string | yes | The report's name, as the owner said it — "Goa", "Q3 household". 1 to 80 characters. |
No output schema declared.
No examples provided.
delete_commitment Delete a commitment ~142
Deletes one commitment and every charge it ever had, by id. This is destructive; cancel_commitment keeps what happened instead. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The commitment id, from commitments or search. By id only, never by name. |
| source | string | – | – |
No output schema declared.
No examples provided.
delete_tag Delete a tag ~174
Removes one tag from the vault's vocabulary — `kind` says which list — and the rows that wore it are left with no category; nothing else about them changes. A row left without a category shows under "No category" until one is set. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | yes | Which list the tag belongs to. |
| name | string | yes | The tag as the vault holds it, any casing. |
| source | string | – | – |
No output schema declared.
No examples provided.
leave_insight Leave an insight ~119
Leaves one short note on an app module; the latest note per module shows on that module's own screen. Modules: dashboard.next_payment, dashboard.active_commitments, dashboard.next_30_days, dashboard.this_month, dashboard.by_account, dashboard.by_category, account.<id>, member.<id>. There are no reports.* modules: the Reports screen shows the months longbook drew. A note is a sentence or two. Notes are appended, and the last note per module wins.
| Name | Type | Req | Description |
|---|---|---|---|
| module | string | yes | – |
| text | string | yes | – |
No output schema declared.
No examples provided.
list_documents List documents ~90
Lists the files in the vault's documents/ folder — bank and card statements the owner dropped in, and source files referenced by rows. Reads PDF (text-bearing), Excel (.xlsx) and CSV; anything else is listed as unsupported. A file still in iCloud is named so, with its download nudged. Start an import here, then read_guide "importing-statements" for the method.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
mark_paid Mark a charge paid ~297
Records that one charge was paid, or takes the mark back with paid: false. The commitment is named by id or the exact name as the memory holds it — a miss answers with the real names. The charge is a row; if no row exists for that day one is written at the commitment's price. `amount` records what left the account when it differed, and `paid_on` the day the money moved when it was not the due date; they change that one row and no other, and a null paid_on or note clears it. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | – | A number, zero or more, up to 1,000,000,000,000,000. |
| date | string | yes | – |
| id | string | – | – |
| name | string | – | – |
| note | – | – | A word about this one charge. Null clears. |
| paid | boolean | – | – |
| paid_on | – | – | The day the money moved, when it was not the due date. Null clears. |
| source | string | – | – |
No output schema declared.
No examples provided.
members List people ~65
Every person the memory holds: id, name, tag (their role in the owner's finances — family, household help, landlord), email, the accounts that belong to them, details as stored when they hold any, how many commitments and charges are for them, and their next unpaid charge.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
next_payment Next payment day ~68
The nearest day any commitment still owes, and every charge landing on it. Charges already marked paid are skipped. A transfer due that day is listed with direction "transfer" and kept out of total, under transfers_total. Amounts are per-currency and never converted, blended, or amortised.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
promote_to_recurring Promote one-time commitments to a recurring one ~444
Takes the ids of one-time commitments that are one thing repeating and makes one recurring commitment: their charges move under it exactly as they are — dates, amounts, paid, basis — the one-time rows go, and the plan continues from the step after the latest, never before today, for plan_months (24 by default), or stops at ends_on for a repeat that has ended. Attributes start as the first row's, direction included, so money in stays money in and a transfer stays a transfer; ids that do not share one direction are refused. Name, tag, member, account and notes may be given; notes are the commitment's three details that matter, one per line. Where writes are proposals, a row is promotable once the owner's app has applied it and commitments shows its id. Every id must be a one-time commitment the memory holds; a miss answers with the real names. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| account | string|null | – | – |
| billing_cycle | string | yes | – |
| custom_cycle_days | number | – | The days between charges of a custom cycle: a whole number, 1 to 36,500. |
| ends_on | string | – | – |
| ids | array | yes | – |
| member | string|null | – | – |
| name | string | – | – |
| notes | string|null | – | The three details that matter most, one per line, each "Label: value" — for insurance "Policy number: …", "Policy name: …", "Document: documents/…". Only what the source states; read_guide "notes" li… |
| plan_months | integer | – | – |
| source | string | – | – |
| tag | string|null | – | – |
No output schema declared.
No examples provided.
read_document Read a document ~144
Returns a document's text: PDFs page by page, Excel sheets as CSV lines under sheet headings, CSV as it is. Long files page through offset/next_offset — keep asking until next_offset is null. Only for files in the vault's documents folder; a statement pasted into the chat is already in front of you. The text stays on this machine and in this conversation; never copy an account or card number out of it into the vault — the validator refuses them. Debit lines are charges; credit lines are money in, written with direction "in"; only movements between the owner's own accounts are skipped.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| offset | integer | – | – |
No output schema declared.
No examples provided.
read_guide Read the guide ~438
Returns longbook's llms.txt — the contract and working method for an AI using longbook — whole, or one chapter by name. Chapters: what-longbook-is, data-minimization-rule, three-doors, first-run, working-method, prompts, importing-statements, past-is-stored-the-future-is-written, tags, categorise-my-longbook, people-and-accounts, documents-folder, document-invoices, notes, reading-reports, month-report, create-a-report, leaving-insights, unattended-runs, daily-email-round, shape, past-is-evidence, invariants, rules-for-anything-that-writes. "importing-statements" covers importing, "reading-reports" report questions, "unattended-runs" scheduled runs, "daily-email-round" the morning look at the owner's mail. Given one of longbook's 26 prompts — by its name (set-up-my-longbook, add-my-statement, categorise-my-longbook, add-a-month-report-in-my-longbook, add-email-invoices-in-my-longbook, set-up-a-daily-longbook-email-round, add-document-invoices-in-my-longbook, add-a-commitment-or-an-expense, what-do-i-pay-next, what-is-coming-in-the-next-30-days, what-did-i-spend-in-a-month, what-renews-this-year, make-my-weekly-longbook-page, create-a-report-in-my-longbook, make-a-report-of-my-trip, tidy-my-longbook, set-up-a-morning-brief, find-subscriptions-from-my-email, find-expenses-from-my-email, find-invoices-from-my-email, find-insurances-from-my-email, find-purchases-from-my-email, find-bills-from-my-email, find-loans-and-emis-from-my-email, find-travel-bookings-from-my-email, find-money-in-from-my-email) or the owner's own words for it, a month's name and all ("Add September month report in my longbook") — it returns that prompt's procedure, with the chapter it builds on. A partial name finds its chapter.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
remove_charges Remove charges ~162
Deletes named rows from one commitment, named by id or the exact name as the memory holds it — a miss answers with the real names: a plan that was wrong. A paid row is a fact, so removing one is destructive. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| dates | array | yes | – |
| id | string | – | – |
| name | string | – | – |
| source | string | – | – |
No output schema declared.
No examples provided.
rename_tag Rename a tag ~187
Renames one tag in the vault's own vocabulary — `kind` says which list, commitment, member or account — and carries every row wearing it, the owner's tag groups too. A name another tag of that kind already wears is refused. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | The tag as the vault holds it, any casing. |
| kind | string | yes | Which list the tag belongs to. |
| source | string | – | – |
| to | string | yes | The new name, in the owner's words. |
No output schema declared.
No examples provided.
reports Read reports ~420
The reports in the vault's reports/ folder, drawn by longbook from the confirmed charges it holds: those dated today or earlier whose basis is anything but "plan". A report may cover any span of days — longbook draws every calendar month on its own; a trip is one whose id starts "trip-"; a span asked for with create_report starts "report-" — and may be narrowed to accounts, members and categories (scope; absent means all). A report still holding unconfirmed passed charges in its currency says so in its own figures — a "Not yet confirmed" stat counts them beside "Total expenses" — so read the total as the part longbook can account for, never as the span's spending. delta_pct is absent whenever no change can honestly be drawn: the month is not over, either month is part-covered, or the month before holds no confirmed spending in this currency. Read its absence as "longbook would not say", never as a month of no spending, and never compute the change from two reports. Without an id it lists them, newest first by the last day each covers: the title, start_date and end_date, the scope, the month when it is one, the day the file was written, how many modules it holds and how many comments sit on them, and the share link when one is live. With an id it returns that report whole — every module exactly as the app draws it, each with its own comments. A module carries "Total expenses", "Accounts", "Categories" and "All charges"; an older file may hold other kinds, and they are returned as they are. A file the app's own decoder would refuse is counted in unreadable, never listed as a report — what this lists is what the Reports screen shows. Comments are the owner's and their viewers' own words: quote them, never rewrite them. An id that matches more than one report answers with the matches, not with a guess. Reports are files, so this reads only on the owner's own machine.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
search Search commitments ~35
Finds commitments by name, category, notes, member, or account — case-insensitive, substring match.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | – |
No output schema declared.
No examples provided.
set_planned_count Set the planned count ~217
Sets how many charges stand from today on for a recurring commitment, named by id or the exact name as the memory holds it — a miss answers with the real names — 240 at most. More are written a cycle apart after the last row, at the commitment's price; unpaid planned rows past the count are unwritten; paid rows, hand-set rows and the past stay. A one-time commitment has its one charge and is refused. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | How many charges stand from today on. 240 at most. |
| id | string | – | – |
| name | string | – | – |
| source | string | – | – |
No output schema declared.
No examples provided.
spending_by_account Spending by account ~58
Spend per account over a window, summed from the charges written in it — the twelve months from today unless you say otherwise. Money in and transfers are left out. Amounts are per-currency and never converted, blended, or amortised.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
spending_by_category Spending by category ~66
Spend per category over a window, summed from the charges written in it — the twelve months from today unless you say otherwise; a past window gives what was spent. Money in and transfers are left out. Amounts are per-currency and never converted, blended, or amortised.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
spending_by_member Spending by member ~58
Spend per member over a window, summed from the charges written in it — the twelve months from today unless you say otherwise. Money in and transfers are left out. Amounts are per-currency and never converted, blended, or amortised.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
tags The tag vocabulary ~60
Every tag this vault already uses — with its icon and how many rows wear it — and then longbook's library for the rest, with the owner's own casing. A tag carries no template: a commitment's or an account's own details live in its notes.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
upcoming Upcoming charges ~76
Every charge written for the next N days (default 30), soonest first, with per-currency totals — and which plans run out inside the window. Transfers between the owner's own accounts are listed with direction "transfer" and summed apart, never in total. Amounts are per-currency and never converted, blended, or amortised.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
update_account Update an account ~331
Changes an account's own attributes — its name, its type (`tag` — the same words as the app's Account Type), its `notes`, the person it belongs to (`member`), its balance with the day it was true, and the account it is linked to (`linked_to`) — by id or the exact name as the memory holds it — a miss answers with the real names. `notes` holds what is particular about the account, one detail per line, such as a card's printed name as "Card name: Platinum Reserve"; numbers are refused. card_name and details are longbook's own, and a set sending a non-empty one is refused. Everything not named stays as it was; an explicit null clears. A balance carries its date; left out, the day of the write is used. A linked account is one level only: a card to the bank account that pays it, never a chain. `member` and `linked_to` name rows the memory already holds. Renaming onto a name another account wears is refused rather than merged. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | – | – |
| name | string | – | – |
| set | object | yes | – |
| source | string | – | – |
No output schema declared.
No examples provided.
update_charge Change a charge ~303
Changes one charge where it sits — its amount, its day, its paid mark, the day the money moved, its note. The commitment is named by id or the exact name as the memory holds it — a miss answers with the real names, and `date` is the day the row sits on. `set.date` moves it: alone, the row keeps its amount as the owner's fact; with `and_later` every unpaid planned row after it follows a cycle apart and keeps its amount, and paid or hand-priced rows stay. `set.amount` with `and_later` reprices the unpaid planned rows after it too, and the commitment's price with them. A day that already holds a charge is refused, and so is a move past the cancelling date. Null clears paid_on or the note. mark_paid is the one-field way to mark. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | yes | The day the charge sits on. |
| id | string | – | – |
| name | string | – | – |
| set | object | yes | – |
| source | string | – | – |
No output schema declared.
No examples provided.
update_commitment Update a commitment ~318
Changes a commitment's attributes, by id or the exact name as the memory holds it — a miss answers with the real names; everything not named stays as it was, and an explicit null clears an optional field. `direction` turns a row into money in ("in") or a transfer between the owner's own accounts ("transfer"), and "out" back into a charge. `amount` is the price now and reaches only unpaid planned charges from `from` (default today); nothing before today is repriced, and a charge priced by hand or proved by a statement stays as it is. `notes` is the commitment's three details that matter, one per line, rewritten as it now stands. `status` pauses, resumes or cancels: pausing or cancelling unwrites the unpaid planned charges after today and keeps what happened; back to active plans nothing. `free_trial` true marks it a free trial, shown as a pill; false takes the mark off; no charge row changes either way. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | – | – |
| name | string | – | – |
| set | object | yes | – |
| source | string | – | – |
No output schema declared.
No examples provided.
update_member Update a person ~235
Changes a person's name, email or tag, by id or the exact name as the memory holds it — a miss answers with the real names; everything not named stays as it was, and an explicit null clears the email or the tag. `tag` is their role in the owner's finances — family, household help, landlord — from the member tags. A person carries a name, a tag, an email and linked accounts; details and card_name are longbook's own, and a set sending a non-empty one is refused. Renaming onto a name another person wears is refused rather than merged. Writes are schema-validated and provenance-stamped, and land in the app's Changes screen where the owner keeps or undoes the whole batch. Card numbers, CVVs and credentials are refused by the validator, which names the row. `source` ("documents/hdfc-2026.pdf", "gmail:18c2…") records where a row came from in the diff.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | – | – |
| name | string | – | – |
| set | object | yes | – |
| source | string | – | – |
No output schema declared.
No examples provided.
whoami Who am I here ~93
Answers who this connection belongs to, what it may do (read, or read and propose changes), how much of its rate allowance is left, whether a hosted copy exists and when it was last pushed, how many proposals are waiting for the owner's app, which ones it could not apply and why (failed_to_apply), and where the schemas live. One call, so it also shows whether the connection can read and write.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
How do I install the longbook MCP server?
longbook runs locally as an npm package, launched with npx -y @longbook/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 · @longbook/mcp
claude mcp add app-longbook-mcp -- npx -y @longbook/mcp
What is the longbook MCP server?
longbook is an MCP server listed in the public MCP registry as app.longbook/mcp. Your longbook of bills, subscriptions and expenses, for your AI to read and to suggest changes to. This page covers its npm package (@longbook/mcp).
Is the longbook MCP server safe to use?
longbook scores 63 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 18 October 2026. It declares no install or post-install scripts. 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 longbook MCP server expose?
longbook exposes 35 tools: next_payment, upcoming, cashflow, spending_by_category, spending_by_account, and 30 more. Their descriptions and schemas cost roughly 6,765 tokens of context every time the server is loaded.
Is the longbook MCP server still maintained?
longbook is still listed as active in the MCP registry. We last reached this channel on 18 October 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 longbook MCP server under?
longbook declares the GPL-3.0-only licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.