CTDS Chimney Top Books
The arithmetic behind Chimney Top Books, offered to AI assistants as 9 tools over the Model Context Protocol.
Bookkeeping arithmetic from Chimney Top Books for a sole proprietor: trial balance, profit and loss, Schedule C summary, the estimated-tax worksheet, statement reconciliation, bank CSV preview and money parsing. Money is integer cents (positive money in, negative money out on a register); dates are YYYY-MM-DD; accounts are named by the code of the default chart (list_chart_of_accounts). Nothing here is tax advice: present Schedule C and estimated-tax figures as a worksheet for the owner or a preparer to confirm. The server holds no books of its own; the caller passes the transactions.
Connect
The server is at https://books.chimneytopdigital.com/api/mcp. It is free, asks for no sign-in and keeps nothing between calls. Rate limits apply per address.
| Client | How |
|---|---|
| Claude Code | One command in a terminal: |
| Claude (web and desktop apps) | Settings → Connectors → Add custom connector, with the URL https://books.chimneytopdigital.com/api/mcp. No sign-in is asked for. |
| Codex CLI | One command in a terminal: |
| Any other MCP client | Use the Streamable HTTP transport with the URL https://books.chimneytopdigital.com/api/mcp: one JSON-RPC message per POST, JSON answers, no session and no authentication. |
To see the raw protocol, list the tools and call one from a terminal:
curl -s https://books.chimneytopdigital.com/api/mcp -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
curl -s https://books.chimneytopdigital.com/api/mcp -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"list_chart_of_accounts","arguments":{}}}'Tools
Every tool is read-only and idempotent, so a client may run it without asking you first. Arguments are checked before a tool runs; a wrong one comes back as a message naming the field.
list_chart_of_accountsThe default chart of accountsEvery account of the default sole-proprietor chart with its code (the id the other tools take), name, type, register kind for bank, card and clearing accounts, and the IRS Schedule C line it rolls up to. Call it first to pick account codes.
type(asset | liability | equity | income | expense): Only accounts of this type
trial_balanceTrial balanceTurns the transactions into balanced ledger lines (debits positive, credits negative, as the app stores them) and sums them by account between two dates. Total debits always equal total credits; a transaction that does not balance or names an unknown account is a tool error.
transactions(array, required): The transactions to sumfrom(string): First date includedto(string): Last date included
profit_and_lossProfit and lossIncome and expense accounts by month, quarter or year for one calendar year, with column totals and net profit, from the transactions given (transfers and equity movements such as owner draws are not income or expenses). Amounts are integer cents in their natural sign.
transactions(array, required): The transactions of the year (others are ignored)year(integer, required)grain(month | quarter | year, default "year")
schedule_cSchedule C summaryRolls the transactions up to the lines of IRS Schedule C (Form 1040) as the default chart maps them: gross receipts, returns, each expense line, the 50% meals limit, Part V other expenses, lines 3, 5, 7, 28, 29 and 31, and any income or expense account with no line. Bookkeeping arithmetic, not tax advice.
transactions(array, required): The transactions of the yearyear(integer, required)from(string): Start of a partial-year range (with to)to(string): End of a partial-year range (with from)
estimated_taxQuarterly estimated-tax worksheetThe app's federal estimated-tax worksheet for a sole proprietor: annualizes the year-to-date Schedule C profit (Form 2210 Schedule AI periods), computes self-employment tax, the standard deduction, a simplified QBI deduction and bracket income tax, applies the prior-year safe harbor when given, and suggests the payment due this quarter with its due date. A planning worksheet, not tax advice; federal only, no credits or state tax.
year(integer, required): Tax year (published tables exist for 2025 and 2026; other years use the newest table and say so)quarter(1 | 2 | 3 | 4, required): Installment: periods end Mar 31, May 31, Aug 31, Dec 31ytd_net_profit_cents(integer, required): Schedule C net profit (line 31) from Jan 1 through the period end, centspaid_so_far_cents(integer, default 0): Estimated payments already made for the year, centsfiling_status(single | mfj, default "single"): single or married filing jointlyother_income_cents(integer, default 0): Annual income from outside the business, centswithholding_cents(integer, default 0): Annual W-2 withholding expected, centsother_ss_wages_cents(integer, default 0): W-2 wages subject to Social Security, centsprior_year_tax_cents(integer): Last year's total tax, for the safe harbor; omit when unknownprior_year_high_income(boolean, default false): Last year's AGI was over $150,000: the safe harbor is 110%
reconcile_statementReconcile a register against a statementCompares the cleared transactions of a bank, card or clearing account on or before the statement date with the statement's ending balance (card balances owed are positive, as on the statement) and lists the cleared transactions to mark reconciled and the outstanding ones. Mark each transaction cleared: true when it appears on the statement.
account_id(string, required): Register account code (1000, 1010, 1020, 1100 or 2000)statement_date(string, required): Statement ending datestatement_balance_cents(integer, required): Statement ending balance, cents (a card balance owed is positive)transactions(array, required): Transactions touching the account, with cleared flags
preview_bank_csvPreview a bank or card CSV exportReads the text of a bank or card CSV export the way the import does: detects the delimiter, skips preamble lines, finds the header, guesses which columns hold the date, description and amount (or debit and credit) and the date format, then parses the rows into signed cents. Returns the guessed mapping, the first rows and any row errors by line number. Nothing is imported.
csv(string, required): The file contentsdelimiter(, | ; | | |): Force a delimiter; omit to detect itmax_rows(integer, default 20): How many parsed rows to return
parse_moneyParse a dollar amount into centsParses a typed amount ("$1,234.56", "-5", "(45.00)") into integer cents exactly as the app does; anything that is not dollars and cents is a tool error.
input(string, required)
allocate_centsSplit an amount without losing a centSplits a total into parts proportional to the weights (largest-remainder method), so the parts always add up to the total: $10.00 three ways is 334, 333, 333. Use equal weights for an even split.
total_cents(integer, required): The amount to split, cents (signed)weights(array, required): One weight per part
Resources
ctds://bookkeeping/tax-notice: Not tax advice. Worksheet, not tax advice: the notice to repeat with any Schedule C or estimated-tax figure.
Limits
- The tools compute from the values the assistant passes in. They cannot read or change anything in your Chimney Top Books account; for that, use the app.
- Results carry the same notices the app shows. They are estimates and working aids, not professional advice; ask your assistant to show the notice with the figure.
- Rate limits apply per address. A request over the limit gets a plain error the assistant can read.
- The tool list may grow. This page is generated from the running server, so it shows the tools as they are today.
If something fails
- "Couldn't reach the MCP server", or a 404
- Check the address character by character: the server answers only at
https://books.chimneytopdigital.com/api/mcp, over HTTPS. Nothing else on this host speaks MCP. - 405 Method Not Allowed
- The client sent a GET. The server speaks the Streamable HTTP transport without an event stream: one JSON-RPC message per POST, a JSON answer, no session. A notification gets an empty 202.
- 429 Too Many Requests
- Your address passed the fair-use limit. The
Retry-Afterheader says how many seconds to wait; the limit resets on its own. - 413 Payload Too Large
- One request may carry 256 KiB. Send fewer rows per call, or summarize before you send.
- A tool answers with an error naming a field
- The argument did not match the tool's schema above: money is integer cents (or plain dollars where the tool says so), dates are
YYYY-MM-DD, and lists are JSON arrays. Fix the named field and call again; nothing was stored. - Still stuck
- Write to support@chimneytopdigital.com with the tool name, the arguments you sent (with nothing personal in them), the time in UTC and the exact message. We keep no record of calls, so what you send us is all we can look at.
How we built the servers, and the rules every one follows: our guide. Questions: hello@chimneytopdigital.com.