数据分析

Clawhub Pkg

试用

用自然语言指令驱动完整复式记账,每笔分录借贷必平。

它能做什么

面向 AI Agent 的会计引擎:导入银行 CSV、OFX、QBO 文件后自动生成平衡且可审计的账套,输出资产负债表、利润表、总账、试算平衡表、调整分录和留存收益结转,均支持按任意期间导出为 CSV 和 PDF。三套接口共用同一数据层——MCP Server(20 个强类型 JSON 工具,12 读 8 写)、仅依赖 Python 3.7+ 标准库的 CLI,以及供人工复核的 Flask 浏览器界面。每个客户的账套保存为一个本地 SQLite 文件(books.db),置于你指定的工作区目录内,工作区外的路径会被拒绝。

什么时候用它

  • 导入银行 CSV、OFX 或 QBO 文件并自动过账到科目表
  • 按指定日期范围生成资产负债表、利润表或试算平衡表
  • 处理 EX.SUSP 暂记户中的未识别交易,并添加基于关键词的分类规则
  • 完成财年结账:锁定期间、结转留存收益、推进下一财年上限

技能文档

Skill: GridTRX Accounting

Demo

Watch the demo: Full accounting cycle in 15 minutes

What it does

Use this skill when the user asks you to "do the books," "categorize expenses," "import bank transactions," "run a balance sheet," or any bookkeeping task. GridTRX is a full-cycle double-entry accounting engine. You prompt in plain English, and the agent completes the books correctly. Every transaction balances. Every amount is deterministic. All data is local — no cloud services, no external APIs.

GridTRX produces a full set of auditable books: balance sheet, income statement, general ledger, trial balance, adjusting journal entries, retained earnings rollforward. Reports are exportable to CSV and PDF for any time period.

Architecture

GridTRX has three interfaces to the same engine (models.pybooks.db):

  1. MCP Server (preferred for agents) — Structured JSON tools. 20 tools (12 read, 8 write) wrapping models.py directly. No text parsing, typed parameters, deterministic output.
  2. CLI (fallback for agents, power users) — One-shot shell commands via python cli.py. Zero dependencies beyond Python 3.7+ standard library. Any terminal-based agent can drive it via subprocess.
  3. Browser UI (for humans) — Flask web interface at localhost:5000 via python run.py. Ledger browsing, report viewer with drill-down, comparative reports up to 13 columns, bank import with rule preview, reconciliation marking, dark mode.

All three hit the same models.py data layer. Nothing is out of sync. Use MCP when available. Fall back to CLI otherwise. The browser UI is for human review.

Prerequisites

Install dependencies before first use (one-time setup):

pip install -r requirements.txt

Or install individually: pip install mcp (MCP server), pip install flask (browser UI). The CLI has no dependencies beyond the Python 3.7+ standard library.

No packages are installed at runtime. All dependencies must be pre-installed.

MCP Setup

Add to the agent's MCP config with GRIDTRX_WORKSPACE set to the user's client folder:

{
  "command": "python",
  "args": ["/path/to/mcp_server.py"],
  "env": {"GRIDTRX_WORKSPACE": "/path/to/clients"}
}

GRIDTRX_WORKSPACE is mandatory — the MCP server will refuse to start without it. Any db_path outside the workspace is rejected at runtime. Every MCP tool takes db_path as its first parameter, which must resolve to a books.db file inside the workspace.

CLI Usage

GRIDTRX_WORKSPACE=/path/to/clients python cli.py /path/to/clients/acme/books.db 

Runs one command, prints plain text to stdout, exits. When GRIDTRX_WORKSPACE is set, the CLI enforces the same workspace boundary as the MCP server — paths outside the workspace are rejected.

Inputs needed

  • The absolute path to the client's books (books.db file or its parent folder).
  • The absolute path to the bank file (.csv, .ofx, or .qbo).
  • The bank account name to post against (typically BANK.CHQ for chequing).

Core concepts

  • Double-entry: Every transaction is a balanced zero-sum entry. Debits = Credits. Always.
  • Sign convention: Positive = Debit. Parentheses (1,500.00) = Credit. = Zero.
  • Amounts: Stored as integer cents internally. Displayed as dollars with two decimals.
  • Account names: Case-insensitive, UPPER by convention. Common prefixes: BANK. EX. REV. AR. AP. GST. RE. SHL. — When importing a trial balance or creating accounts, ALWAYS use GridTRX naming. Never use numeric account codes. If the source data has numeric codes (1010, 5800, etc.), ignore the codes and map by description to the nearest GridTRX account name. If no match exists, create the account using the EX. or REV. prefix convention. Always call list_accounts first before creating anything.
  • EX.SUSP (Suspense): Where unrecognized transactions land. This is the triage queue. Tell the AI what the suspense items are and it will clear them. Or clear them yourself through the GUI.
  • Import rules: Keyword → account mappings. Case-insensitive match, highest priority wins. Optional tax code splits the amount into net + tax automatically.
  • Lock date: Prevents changes to closed periods. Check before importing historical data.
  • Architecture: Each client is one SQLite file. Copy it, back it up, email it. One data layer (models.py) — CLI, MCP server, and browser UI all call the same functions.

Workflow

Step 1: Initialize (if no books exist)

MCP: No direct tool — use exec to run CLI. CLI: python cli.py then new /path/to/folder "Company Name"

This creates books.db with a full chart of accounts (~60 posting accounts), five reports (BS, IS, AJE, TRX, RE.OFS), 60+ import rules, and four tax codes. Always use starter books as the base — they include the critical perpetual retained earnings chain (IS → NI → RE.CLOSE → RE on BS, plus RE.OFS/RE.OPEN for year-end). Never build reports from scratch without this chain. The fiscal year ceiling (fy_end_date) is automatically set to the current fiscal year end.

After setup, run validate to confirm the report chain is intact: CLI: python cli.py /path/to/books.db validate

Step 2: Import bank data

MCP (preferred):

  • CSV: import_csv(db_path, csv_path, "BANK.CHQ")
  • OFX/QBO: import_ofx(db_path, ofx_path, "BANK.CHQ")

CLI fallback:

  • CSV: python cli.py /path/to/books.db importcsv /path/to/file.csv BANK.CHQ
  • OFX: python cli.py /path/to/books.db importofx /path/to/file.qbo BANK.CHQ

The import applies all rules automatically. Check the result summary: posted, skipped, to_suspense.

CaseWare AJE import:

  • MCP: import_aje(db_path, file_path, "25AJE")
  • CLI: python cli.py /path/to/books.db importaje /path/to/aje_export.iif 25AJE
  • Supports QuickBooks IIF and Venice/MYOB text formats. Maps CsW account descriptions to Grid account codes.

Step 3: Audit suspense

MCP: get_ledger(db_path, "EX.SUSP") CLI: python cli.py /path/to/books.db ledger EX.SUSP

Every entry here is an unrecognized transaction. Note the description and transaction ID for each.

Step 4: Resolve suspense with the user

Present each suspense item to the user. Ask: "What category is this?"

Do NOT guess. If the description is ambiguous (e.g., "AMAZON", "BEST BUY", "TRANSFER"), ask the user for business context before categorizing.

Once the user answers, add a rule so future imports are automatic:

MCP: add_rule(db_path, "AMAZON", "EX.OFFICE", "G5", 0) CLI: python cli.py /path/to/books.db addrule AMAZON EX.OFFICE G5 0

Tax code is optional. Common codes: G5 (GST 5%), H13 (HST 13%), H15 (HST 15%), E (exempt).

Step 5: Clear the bad suspense entries and re-import

Delete each suspense transaction, then re-import so the new rules apply:

MCP: delete_transaction(db_path, txn_id) for each, then import_csv(...) or import_ofx(...) again. CLI: python cli.py /path/to/books.db delete for each, then re-run the import command.

Repeat Steps 3-5 until suspense is empty.

Step 6: Verify and report

MCP:

  • trial_balance(db_path) — debits must equal credits
  • generate_report(db_path, "BS") — Balance Sheet
  • generate_report(db_path, "IS") — Income Statement

CLI:

  • python cli.py /path/to/books.db tb
  • python cli.py /path/to/books.db report BS
  • python cli.py /path/to/books.db report IS

Step 7: Year-end rollforward

When the fiscal year is complete:

MCP: rollforward(db_path, "2025-12-31") CLI: python cli.py /path/to/books.db rollforward 2025-12-31

This reads RE.CLOSE from the IS, posts Dr RE.OFS / Cr RE.OPEN, sets the lock date, and advances the FY ceiling to the next year. Then repeat from Step 2 for the next fiscal year. Rows beyond the ceiling are automatically skipped during import.

Recovery: Undoing a bad import

If the user uploaded the wrong file or you imported against the wrong account:

  1. Find the bad transactions: search_transactions(db_path, "some description") or via CLI search .
  2. Delete them one by one: delete_transaction(db_path, txn_id) or CLI delete .
  3. Verify the trial balance still balances after cleanup.
  4. Re-import the correct file.

There is no bulk undo. Deletions are individual and respect the lock date — you cannot delete transactions in a locked period.

MCP tools reference (20 tools)

Read tools

ToolPurpose
list_accounts(db_path, query?)List/search chart of accounts
get_balance(db_path, account_name, date_from?, date_to?)Single account balance
get_ledger(db_path, account_name, date_from?, date_to?)Account ledger with running balance
trial_balance(db_path, as_of_date?)Trial balance — all accounts, Dr/Cr columns
generate_report(db_path, report_name, date_from?, date_to?)Run a report (BS, IS, AJE, etc.)
get_transaction(db_path, txn_id)Single transaction with all journal lines
search_transactions(db_path, query, limit?)Search by description/reference
list_reports(db_path)List available reports
list_rules(db_path)List import rules
get_info(db_path)Company name, fiscal year, lock date

Write tools

ToolPurpose
post_transaction(db_path, date, description, amount, debit_account, credit_account)Post a simple 2-line entry
delete_transaction(db_path, txn_id)Delete a transaction (respects lock date)
add_account(db_path, name, normal_balance, description?)Add a posting account
add_rule(db_path, keyword, account_name, tax_code?, priority?)Add an import rule
delete_rule(db_path, rule_id)Delete an import rule
import_csv(db_path, csv_path, bank_account)Import bank CSV
import_ofx(db_path, ofx_path, bank_account)Import bank OFX/QBO
import_aje(db_path, file_path, ref_prefix)Import CaseWare AJE export (IIF or Venice)
rollforward(db_path, ye_date)Year-end rollforward (posts RE closing, sets lock, advances ceiling)
year_end(db_path, ye_date)Alias for rollforward
set_lock_date(db_path, lock_date?)Show or set the lock date
set_ceiling(db_path, date?)Show or set the fiscal year ceiling
bulk_report_layout(db_path, report_name, items, after_account?, mode?)Batch-place items on a report (accounts, totals, labels, separators)

Guardrails

  • NEVER GUESS CATEGORIES. If a transaction description is ambiguous, let it go to EX.SUSP and ask the user. Do not assume "AMAZON" is office supplies — it could be inventory, personal, or cost of sales.
  • NEVER MODIFY books.db DIRECTLY. All writes go through cli.py commands or MCP tools. Never use file tools to read or write the SQLite database.
  • STAY IN THE WORKSPACE. Only operate on books.db files within the user's GridTRX workspace. Both the MCP server and CLI enforce this when GRIDTRX_WORKSPACE is set — the MCP server will not start without it, and both interfaces reject any path outside the workspace.
  • NO OUTBOUND NETWORK REQUESTS. GridTRX processes data locally. It does not phone home, call APIs, or transmit data. Do not attempt to "verify" transactions against external services.
  • RESPECT THE POSTING WINDOW. Before importing, check the lock date and FY ceiling with get_info(). You cannot post on or before the lock date, or after the FY ceiling. Run rollforward to advance to the next fiscal year.
  • PRESERVE RAW OUTPUT. When presenting financial data to the user, use the exact numbers from GridTRX. Do not round, reformat, or flip signs. Positive = Debit. Parentheses = Credit.
  • TRIAL BALANCE MUST BALANCE. After any operation, if the trial balance shows unequal debits and credits, something is wrong. Stop and investigate before proceeding.
  • LIMIT EXEC SCOPE. When using exec, only run python cli.py commands against books within the workspace. Do not run arbitrary shell commands, install packages, start background processes, or execute scripts other than cli.py. The MCP server is the preferred interface — use CLI only when MCP is unavailable.

常见问题

是否需要联网或调用外部服务?
不需要。所有处理在本地完成,文档明确说明不会发起对外网络请求,也不调用任何外部 API。
数据存放在哪里?
每个客户对应一个 SQLite 文件(books.db),位于通过 GRIDTRX_WORKSPACE 指定的工作区目录内;引擎会拒绝工作区之外的任何数据库路径。
识别不出的交易会怎么处理?
进入 EX.SUSP 暂记户。规范要求遇到描述模糊的交易(如 AMAZON、BEST BUY)时必须向用户确认分类,禁止猜测。

相关技能

Record, query, complete, correct, and undo personal bookkeeping entries through short natural-language conversation, with local JSONL and Markdown persistenc...

17 次安装

把账本记到能平、能对上、能经得起审计和税务检查。

105 次安装6 星标

通过托管 OAuth 网关访问 QuickBooks Online API,默认只读,写入需用户确认。

247 次安装5 星标

Help users with Validated demand: Finance and operations teams need repeatable workflows for reconciling bank feeds, invoices, receipts, payment processor ex...

智能自动记账助手。一句话即可完成记账,自动识别时间、金额、分类。 支持自然语言输入(如"昨天午饭30"),无需手动填写日期/类型。 本地 SQLite 存储,生成月度可视化 HTML 报告。 触发词:记账, 消费, 花了, 买了, 收到, 今天花, 记一笔, 查账, 账单报告, auto-bookkeeping,...

5 次安装

用自然语言记账、查余额、管预算、追攒钱目标、看持仓盈亏,数据全在本地 CSV。

33 次安装1 星标