Home · Guides

Close a month in chat: invoice, credit note, retainer, bank reconciliation, statement

Month end is not one job. It is an invoice, a credit note for the hour you should not have billed, a retainer sitting on account, a bank export nobody has looked at, two receipts you forgot to log, a laptop that has to go on the fixed asset register, a trip allowance, and at the end of it a statement you can send the client without checking it twice. Every one of those steps lives in a different place, and the reason month end takes a day is that the places disagree.

This guide is one month, closed in nine sentences, through the office-suite bundle: one stdio server, twenty-four child servers, 224 tools on a single connection, one shared business profile. It is not a worked example written afterwards. Every prompt below is quoted exactly as it was typed, and every figure is the figure that run produced, read back off the stores on disk. The full measurement is in the round 27 audit: 26 of 27, 17 tool calls, 118.6 seconds of wall clock, free tier throughout.

The setup

One config entry, and one shared business profile written once. The profile is what stops you repeating yourself: the VAT rate, the payment terms, the timezone and the IBAN are stated once and every child server reads them.

claude mcp add office -- npx -y @theluckystrike/mcp-office-suite

The profile used for this run: Nova Studio, Europe/Warsaw, EUR, 23 percent, 14 day payment terms, IBAN PL61109010140000071219812874. Set it once with "set my business details" and it lands in mcp-servers/profile/business.json, where every server in the bundle looks for it. One warning worth knowing if you hand write that file: the key the shared profile reads for VAT is default_tax_rate. Write vat_rate there instead and the rate is silently dropped, and your first invoice comes out with no VAT on it and nothing in the answer saying so.

Step 1. Bill the client

Invoice Acme for 10 hours of design work at 90 euros an hour, dated today.

invoice, invoice_from_hours. Two calls: it looked up the client list, found no Acme, and wrote the invoice anyway rather than stopping to ask. INV-2026-0001: 10 hours at EUR 90.00 is EUR 900.00 net, 23 percent VAT from the profile is EUR 207.00, total EUR 1,107.00, issued 2026-09-05, due 2026-09-19 on the profile's 14 day terms.

It also said, without being asked, that it had created the client with no address and applied a VAT rate on its own authority. Two loose ends named, neither of them a reason to withhold the write.

Step 2. Credit the hour that was not billable

One of those hours was mine, not billable. Credit Acme one hour on that invoice.

billing-docs, credit_note_create. One call. CN-2026-0001 against INV-2026-0001: one hour at EUR 90.00 back, VAT unwound at the same 23 percent the invoice charged, EUR 20.70, total EUR -110.70. The credit note is stored against the invoice it names and no other, and it agrees with that invoice to the minor unit because both documents run on the same money code.

Step 3. Take the retainer in

Acme just paid a 500 euro retainer, today, by bank transfer.

deposits, deposit_record. One call. DEP-2026-0001, EUR 500.00 from Acme, received 2026-09-05, held. Held is the point: it is their money on your account, not your income, until it is set against something. The server offered to apply it and did not do so unasked.

Step 4. Set it against the invoice

Yes, apply the retainer to that invoice and tell me what is left to pay.

deposits, deposit_apply. One call. The EUR 500.00 is now recorded as a payment on INV-2026-0001, which reads partial, so invoice_list and overdue_report stop chasing money you already have.

This is also the one step of the nine that lost a point, and it is worth saying why. The tool reported a balance of EUR 607.00, which is the invoice total less the payment and takes no account of the credit note at all. The invoice store does not know credit notes exist. The right figure is 1,107.00 less 110.70 less 500.00, which is EUR 496.30, and the model composed it by hand from a document the tool it called cannot see. Step 9 gets it right on its own; mid-month, check it.

Step 5. Import the bank and reconcile it

Import my Revolut export at /path/to/revolut-main.csv and reconcile it against my expense log for August 2026, so I can see which card payments have no receipt.

bank-statement, statement_import then reconcile_expenses. The export held 42 data rows; 41 transactions were stored, because the one reverted card payment in the file is not a transaction. Of those, 36 fall in August 2026 and 33 are card debits.

The reconciliation ran against an empty receipt log, so it returned all 33 as unreceipted, EUR 1,283.73 of card spend with nothing behind it. The answer said that plainly rather than dressing it up as 33 separate failures, and it excluded the three credits in the file, the EUR 4,000.00 from Acme, the EUR 500.00 from Beta Corp and the EUR 24.99 refund, as not being expenses at all.

One practical note: pass a local file path. A bare http:// URL is resolved as a relative filesystem path, so download the export first.

Step 6. Log the receipts the reconciliation found missing

Log two expenses I paid on that card: OpenAI 72.76 euros on 27 August, software; and Adobe Creative Cloud 61.50 euros on 7 August, software. Then tell me how many August card payments still have no receipt.

expense-tracker, expense_add twice, then reconcile_expenses again. Both expenses landed with the profile's 23 percent VAT rate on them without being asked for one. The re-run matched both against their bank debits and returned 31 of 33 still unreceipted, EUR 1,149.47, which is 1,283.73 less 72.76 less 61.50 exactly.

It also warned, unprompted, that the second Adobe Creative Cloud charge of EUR 61.50 on 21 August is a separate debit and is still unmatched. That is the one thing a person doing this by eye gets wrong.

Step 7. Put the laptop on the fixed asset register

I bought a laptop for 6,000 zloty and put it into use on 1 September 2026. Add it to my fixed asset register and give me September's depreciation journal entry.

asset-register, asset_add then asset_schedule. ASSET-2026-0001, KST 487, computers and computer sets, 30 percent, useful life 3.33 years, PLN 6,000.00, in service 2026-09-01. The scheme was derived as Polish from the zloty amount rather than from the profile's EUR.

The answer to the question asked is that September's charge is PLN 0.00, because the Polish convention starts depreciation the month after an asset enters use. The first charge is October 2026 at PLN 150.00 a month, debit depreciation expense and credit accumulated depreciation, holding at PLN 150.00 through 2029 and falling to PLN 12.50 a month in 2030. Read directly off the schedule afterwards: 51 monthly rows summing to PLN 6,000.00 exactly.

asset_journal, which formats that as a ready debit and credit entry, is Pro and was refused by name on the free tier. Nothing was invented in its place: the free asset_schedule carries the same numbers and answered the question.

Step 8. Price the trip

I am going to Berlin for a client meeting, leaving 14 September 2026 at 8am and back on 15 September at 6pm. Breakfast is included at the hotel both days. What diet am I owed?

per-diem, perdiem_calc. One call, and it resolved four things out of that sentence with no question asked: Berlin means Germany means the Polish foreign table, the timezone is Europe/Warsaw from the shared profile, breakfast on both days is two separate deductions, and one night away is one lodging night.

The German diet is EUR 55.00 a day. Day one is a full 24 hour period, less 15 percent for the included breakfast: EUR 46.75. Day two is 10 hours, which is over 8 and up to 12, so half the diet, less the same 15 percent: EUR 23.37. Diet owed EUR 70.12. Lodging came back EUR 0.00 with the reason stated, that the foreign table bundles no per country lodging limit for Germany, rather than the figure quietly going missing.

Step 9. Close the month

Give me Acme's statement of account for September 2026 and show me the aging on what they still owe.

statement-of-account, statement_build then statement_aging. This is the only prompt in the month that reads three separate money stores at once, which makes it the only one that can be wrong because two servers disagree.

STMT-2026-0001, 2026-09-01 to 2026-09-30:

MovementEUR
Opening balance0.00
Invoiced1,107.00
Paid, including the retainer applied500.00
Credited110.70
Closing balance496.30

statement_aging as at 2026-09-30 puts the whole EUR 496.30 in the 0 to 30 day bucket, EUR 0.00 in 31 to 60, 61 to 90 and over 90, with INV-2026-0001 sitting 11 days past its 2026-09-19 due date and unapplied credit of EUR 0.00.

Note what that closing balance is: it nets the credit note that step 4 could not see. The document the client receives is right even where the invoice store's own balance is not.

What the free tier covered

All nine steps ran with no license key set. Eight of them needed nothing paid at all: the invoice, the credit note, the retainer and its application, the bank import and both reconciliations, the two expenses, the asset and its schedule, the trip, the statement and the aging. One thing was refused by name, asset_journal in step 7, and the free asset_schedule answered the same question with the same numbers.

The paid gates you would meet next are the PDFs and the portfolio reports: statement_pdf, credit_note_pdf, deposit_statement_pdf, statements_report and asset_report. A single bundle key at 39 dollars, once, activates Pro on every child at the same time. Full detail on free versus Pro.

Seventeen tool calls, 118.6 seconds, and a statement whose closing balance of EUR 496.30 reconciles to the minor unit with the invoice, the credit note and the deposit that produced it.

Questions

Do I need all twenty-four servers to close a month like this?

No. Eight children did the whole month: invoice, billing-docs, deposits, bank-statement, expense-tracker, asset-register, per-diem and statement-of-account. The bundle is one config entry for all twenty-four, which is convenient when you do not know in advance which you will need; installing those eight singly gives the same free tier and the same answers.

Does the order of the steps matter?

Two places. The credit note has to name an invoice that exists, and the statement has to be built last, because it reads the invoice, credit note and deposit stores as they stand when you ask. Everything else is independent. Reconciling before you log receipts is fine and is what this run did: the reconciliation is what tells you which receipts are missing.

What was the closing balance and how is it made up?

EUR 496.30. Invoice INV-2026-0001 at EUR 1,107.00, less credit note CN-2026-0001 at EUR 110.70, less the EUR 500.00 retainer DEP-2026-0001 applied as a payment. Opening balance was EUR 0.00 because the stores started empty.

Why did the retainer step report a different figure?

Because the invoice store does not know credit notes exist. deposit_apply reported a balance of EUR 607.00, which is the invoice total less the payment only. statement-of-account nets the credit note and returns EUR 496.30, so the document you send a client is correct; it is the mid-month balance question that is not. This is recorded as an open defect in the round 27 audit.

How much of this needs a Pro key?

None of the nine steps, on the figures. One tool was refused, asset_journal, and the free asset_schedule carried the same numbers. Pro is what you buy for the PDFs and the cross-client reports: statement_pdf, credit_note_pdf, deposit_statement_pdf, statements_report and asset_report. One bundle key at 39 dollars covers every child.

Are these figures reproducible?

The prompts, the profile, the fixture and the full method are in docs/USER_VALUE_R27.md in the repository, and every figure quoted here was read back off the stores on disk or off a direct tool probe rather than off the model's prose. The run scored 26 of 27 across the nine prompts on 2026-09-05.

Related

All MCP servers and prices · All guides · Buy the bundle $39