Skip to main content
Glama

mcp-invoices-pt

Invoice bookkeeping for freelancers in Portugal, done with an AI assistant.

You keep downloading invoices and receipts as you do today. Then you ask your assistant "organize my receipts", and it:

  • reads each document,

  • files it in a folder per tax year, under a consistent name,

  • books it in an Excel workbook (or a Google Sheet, if you prefer),

  • works out what goes into each box of the quarterly IVA return (Declaração Periódica), including the credit carried over from the previous quarter,

  • keeps the totals you need for IRS and the quarterly Segurança Social declaration,

  • and tells you what is still missing.

Technically it is an MCP server: a set of tools that an AI assistant such as Claude runs on your computer.

WARNING

No guarantee, and not tax advice. I do not guarantee that this software, or any figure it produces, is correct, complete or up to date with Portuguese tax law. It can misread a document, pick the wrong VAT treatment or put a value in the wrong box. Nothing here is tax, legal or accounting advice.

You are responsible for what you submit to the Autoridade Tributária. Check every figure against your documents before you file, and ask a certified accountant (contabilista certificado) when in doubt. I accept no liability for any loss, penalty or interest that results from using it. See also the License.

Updated regularly. New invoice and receipt layouts are added as they come up. See Supported documents and the CHANGELOG. If yours is not read yet, open an issue with a redacted sample, or add it yourself.


Contents

  1. Quick start

  2. Who it is for

  3. Supported documents

  4. How it reads documents

  5. Your folders and books

  6. Setup in detail

  7. Day-to-day use

  8. Tools reference

  9. Safety

  10. Privacy: public code, private data

  11. Adding a document type

  12. Tests

  13. Limitations

  14. License


Related MCP server: BossDrawer

Quick start

You need:

  • Claude Desktop (macOS or Windows) or Claude Code, or another app that supports MCP servers;

  • Python 3.12 or newer;

  • poppler, a small free tool for reading PDFs.

It is tested on Linux and should work the same on macOS. Windows is untested.

  1. Install poppler and pipx, then the tools:

    # macOS (with Homebrew):  brew install poppler pipx
    # Ubuntu / Debian:        sudo apt install poppler-utils pipx
    pipx install "git+https://github.com/delpapa/mcp-invoices-pt"
  2. Write your settings. Download config.example.yaml, save it as ~/.config/mcp-invoicesPT/config.yaml, and put your NIF in it. Every other setting has a sensible default:

    • documents arrive in ~/Downloads;

    • each tax year lives in ~/Taxes/<year>;

    • the books are an Excel file inside that folder.

  3. Create this year's books:

    mcp-invoices-pt init-sheet 2026

    This creates ~/Taxes/2026/ with Expenses/, Income/ and Bookkeeping_2026.xlsx.

  4. Connect it to your assistant.

  5. Download a few invoices and ask: "organize my receipts".


Who it is for

A trabalhador independente (freelancer issuing recibos verdes) who:

  • is in the normal VAT regime (not the art. 53.º exemption) and files the quarterly Declaração Periódica;

  • buys from Portuguese suppliers and from abroad (EU and non-EU software, cloud services, online shops);

  • sells to clients in Portugal, the EU or outside it;

  • uses e-Fatura and the Portal das Finanças (recibos verdes).

The usual cross-border cases are handled:

  • reverse charge (autoliquidação) on EU and non-EU services;

  • intra-EU purchases of goods;

  • foreign suppliers who charged you Portuguese or foreign VAT (OSS);

  • non-deductible IVA (meals, transport);

  • partial business use, e.g. 30% of home rent;

  • sales to clients in the EU (box 7) and outside it (box 8).

Supported documents

Portuguese documents, from any issuer (read from the official AT QR code):

  • Fatura (FT), fatura simplificada (FS), fatura-recibo (FR), nota de crédito (NC), nota de débito (ND), and recibo (RG/RC). That covers telecoms, utilities, landlords, shops and restaurants: anything issued by certified software.

  • PDFs, or a photo of the paper receipt.

  • The recibos verdes, faturas and faturas-recibo you issue on the Portal das Finanças.

  • The e-Fatura CSV export, for invoices that only exist there.

  • Your submitted Declaração Periódica PDF, used to check and lock a quarter you have filed.

Foreign layouts (one parser each):

Parser

Covers

Notes

stripe

Invoices and receipts hosted by Stripe, the layout many software and AI subscriptions are billed with

Supplier, country, VAT numbers (yours and theirs), totals, VAT charged, card ending

github

GitHub invoices and payment receipts

google_cloud

Google Cloud EMEA invoices

google_play

Google Play order receipts (the e-mail saved as PDF)

wise

Wise transfer confirmations

The expense is the fee, at Wise's own exchange rate

amazon

Amazon EU marketplace invoices issued by the seller (Spanish layout, Amazon.es)

Intra-EU goods: reverse charge

Your own sales invoices. If you also issue invoices of your own besides the Portal document, there is an example parser for a common template in examples/parsers/simple_invoice.py. Copy it into your private parsers folder and adapt it.

Anything else still works: the assistant reads the text itself. Once a layout is added as a parser, it no longer needs to.

How it reads documents

Each document goes through these layers in order, and the first one that works wins:

Layer

What

AI needed?

1. AT QR code

Every invoice from certified Portuguese software and every recibo verde has one (Portaria 195/2020). It holds the NIFs, date, number, ATCUD, and base and IVA per rate.

No

2. Layout parsers

One small module per invoice layout (list above).

No

3. e-Fatura export

The CSV from e-Fatura.

No

4. Plain text

Anything else: the assistant reads the text and fills the fields.

Yes

Every document is also checked for:

  • the card ending printed on a receipt;

  • reverse-charge wording (in English, Portuguese, German and Spanish);

  • "art. 138" intra-EU supplies;

  • Portuguese VAT charged by a foreign supplier.

From all that, the tools propose how to book the document:

  • the VAT code, which decides the IVA boxes;

  • the exchange rate: the official ECB rate for that day, or the rate printed on the document (e.g. Wise);

  • the payment account;

  • the business share;

  • the file name.

Your rules in the private config, per supplier and per client, override any of these.

Your folders and books

Folders

~/Taxes/2026/
├── Bookkeeping_2026.xlsx           the books
├── Expenses/                       every purchase document, renamed
│   ├── accountant_01_FT-A1-123.pdf
│   ├── github_02_INV000000001.pdf
│   └── ...
├── Income/                         your sales: your invoice (if any) and the Portal document
│   ├── 20260215_recibo_RG-A1-1.pdf
│   └── ...
├── eFatura_2026_export_20260415.csv
└── IVA_2026_1TRI_....pdf           your submitted returns (save them here)

File names are <supplier>_<month>_<document number>. The supplier part comes from your rules, the supplier's name, or its NIF.

The books

init-sheet YEAR (or asking the assistant to create the year's books) makes an Excel workbook, which opens in Excel, LibreOffice or Numbers. A Google Sheet is an option: set backend: google and see Google Sheets.

Expenses sheet

  • Declaração Periódica, one column per quarter:

    • the boxes you type on the Portal: 3, 4, 7, 8, 12, 13, 16, 17, 20, 24, 61 and 98;

    • the boxes the Portal calculates, so you can check them: 90, 91, 92, 93, 94 and 96.

    • Box 61 (the credit carried in) is the previous quarter's box 96. Q1's comes from the previous year's Q4.

  • QUARTERS: quarter sums under the table's columns.

  • The table, one row per purchase.

Income sheet

  • IRS & SS, per quarter:

    • gross income by invoice date, for IRS Anexo B;

    • income by recibo date, for the quarterly Segurança Social declaration;

    • business expenses.

  • The table, one row per sale.

The cells are ordinary formulas, so you can read, check and change the books by hand.

What the columns mean

Column

Meaning

Amount paid

What the document says you paid, in its own currency, VAT included

VAT included

The VAT inside that amount, in the same currency (0 when none was charged)

FX to EUR

Units of the foreign currency per 1 € (e.g. 1.10 for dollars), as the ECB publishes it; 1 for euros

Amount €, Net € (-VAT)

The same in euros, with and without VAT

NIF?

Whether the invoice shows your NIF. Portuguese IVA is only deductible if it does

VAT code

How the purchase is treated for IVA (table below); decides the boxes

Business %

Share used for work: 100% normally, e.g. 30% for home rent

Box N

That purchase's contribution to box N of the Declaração Periódica

Net VAT benefit €

IVA you get back minus IVA you self-charge (0 for reverse charge)

IRS deductible €

The business cost for IRS: what you paid, times the business share, minus the IVA you recover

Document

What backs the row: QR-verified PDF, invoice, receipt, e-Fatura only, no invoice, MISSING

Payment account

Which card or account paid

Q

The quarter, from the date

VAT codes (purchases)

Code

When

Boxes

PT

Portuguese IVA, deductible

24

PT-ASSET

Portuguese IVA on equipment you keep (e.g. a laptop)

20

PT-NONDED-MEAL

Meals: IVA not deductible (art. 21 CIVA)

–

PT-NONDED-TRAVEL

Transport of people: IVA not deductible

–

NoVAT

Exempt operation (e.g. rent)

–

NONE

Nothing to self-charge (bank and payment fees, no invoice)

–

EU-RC

Services from an EU supplier that charged no VAT (reverse charge)

16 + 17, deducted in 24

EU-RC-GOODS

Goods from an EU supplier that charged no VAT (reverse charge)

12 + 13, deducted in 24

NON-EU-RC

Services from outside the EU that charged no VAT (reverse charge)

3 + 4 and 98, deducted in 24

OSS-PT-VAT-NONDED

A foreign supplier charged you Portuguese IVA

not deductible

FOREIGN-VAT-NONDED

A foreign supplier charged another country's VAT

not deductible

Sales codes

Code

When

Boxes

PT / C3

Portuguese client, IVA at 23%

3 + 4

EU / C7

Business client in another EU country, no IVA

7, and the Declaração Recapitulativa

NON-EU / C8

Client outside the EU, no IVA

8

Box numbers follow the Declaração Periódica in force for periods before 1 July 2027. Portaria 298/2026 changes the return after that, and this project will follow.

Setup in detail

1. Install

With pipx (simplest; pipx installs a command-line program in its own space):

pipx install "git+https://github.com/delpapa/mcp-invoices-pt"            # add [google] for Google Sheets

From a clone (if you want to change the code):

git clone https://github.com/delpapa/mcp-invoices-pt && cd mcp-invoices-pt
python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"                 # add ,google for Google Sheets

Either way you also need poppler: brew install poppler on macOS, or sudo apt install poppler-utils on Ubuntu / Debian.

2. Your private config

Save config.example.yaml as ~/.config/mcp-invoicesPT/config.yaml. Every line in it is commented. The settings that matter:

Setting

What to put

taxpayer.nif

Your NIF (required)

paths.inbox

Where downloads arrive. ~/Downloads works, but a dedicated folder is better: only what is in it gets looked at

paths.year_root

One folder per tax year, e.g. ~/Taxes/{year}

cards

The last 4 digits of your cards, in quotes, mapped to the account names you use: "1234": my-bank

suppliers

Optional per-supplier rules: a display name for Portuguese suppliers (their QR code carries only the NIF), a file-name prefix, the account, a VAT code, the business share

clients

Optional per-client rules for sales: name, tax id, country, VAT case, account

The config is YAML. Indentation matters, # starts a comment, and text values are safest in "quotes".

3. Create the year's books

mcp-invoices-pt init-sheet 2026                    # or: init-sheet 2026 <IVA credit carried in>

Without the credit, it is read from the previous year's Q4, if those books exist. You can also just ask the assistant to "create the 2026 books".

4. Connect to your assistant

Claude Code:

claude mcp add --scope user invoices-pt -- mcp-invoices-pt

Claude Desktop: open Settings → Developer → Edit Config (the file is ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, and %APPDATA%\Claude\claude_desktop_config.json on Windows), add this, and restart Claude Desktop:

{
  "mcpServers": {
    "invoices-pt": {"command": "/full/path/to/mcp-invoices-pt"}
  }
}

which mcp-invoices-pt in a terminal shows the full path; with pipx it is usually ~/.local/bin/mcp-invoices-pt. If your config is somewhere else, add "env": {"INVOICES_PT_CONFIG": "/path/to/config.yaml"} next to command.

5. Already have invoices filed?

Ask the assistant to "run index_year for 2026". Afterwards, a document you download again is recognised as a copy.

Optional: Google Sheets instead of Excel

  1. Install with [google] and set backend: google in the config.

  2. In a Google Cloud project, enable the Google Sheets API and create a service account.

  3. Download its JSON key to the path in google.service_account, and keep it private.

  4. Create a Google Sheet and share it with the service account's e-mail as Editor. Put the sheet's ID (from its URL) in google.spreadsheet_id.

  5. init-sheet YEAR then adds the year's tabs to that sheet.

Day-to-day use

Collect

  • Purchases:

    • download invoices and receipts from supplier portals (Stripe invoices, GitHub billing, cloud consoles, Amazon orders);

    • for paper receipts from Portuguese shops, photograph the QR code clearly.

  • Sales: the Portal document you issued (recibo verde, fatura or fatura-recibo). If you also send clients an invoice of your own, save that too.

  • Every so often: the e-Fatura export. On the Portal das Finanças: e-Fatura → Adquirente → Verificar faturas → export. It catches Portuguese invoices you never downloaded.

Ask

Close the workbook first if it is open in Excel or LibreOffice; the tools will not write to an open workbook.

You say

It does

"Organize my receipts."

Makes a plan of everything in the inbox and shows it to you. After you confirm, it files and books each document, books sales, checks the e-Fatura export, and reports what is missing. It asks about judgment calls, such as business or personal, or whether IVA is deductible

"What do I type for Q3?"

The Declaração Periódica boxes for the quarter, the credit carried over, and the result

"Q3 submitted."

Freezes that quarter's figures and locks its rows. If you saved the return PDF in the year folder, it compares the two; the submitted return is the source of truth

"What's missing for 2026?"

Rows marked MISSING, files that are gone, incomplete rows, unbooked files, receipts for payments already booked, gaps in monthly subscriptions, sales without a Portal document

"IRS and Segurança Social totals for 2026?"

Gross income, income by recibo date, business expenses, per quarter

"Create the 2027 books."

Next year's workbook, with the IVA credit carried over

Sales

  • The common case: only the Portal document. If you issue a fatura-recibo (or recibo verde) on the Portal and nothing else, that document is the sale. Its QR code gives the date, amount, IVA, withholding and client tax id. Add a clients rule so it books with the client's name.

  • With an invoice of your own: if you also send your own invoice (e.g. in dollars to a foreign client), the plan pairs it with its Portal document by date and amount. The row keeps both, and the exchange rate implied by the two.

Type the return

On the Portal das Finanças, under IVA → Declaração Periódica, fill quadro 06 and 06-A with the boxes from "What do I type for Q3?". Box 61 is the credit carried in. After submitting, save the PDF in the year folder and say "Q3 submitted".

Fixing a mistake

Edit the workbook directly: the tools read whatever is there, and the formulas recalculate. The exception is a quarter you marked as submitted: its declaration figures are frozen, so later edits to its rows no longer change them. To deliberately correct a filed quarter, ask the assistant. That is also when you would file a substitute return.

A new year

Ask for the new year's books, or run init-sheet <year>. The IVA credit carries over automatically.

Tools reference

Tool

Arguments

Does

plan_inbox

–

Reads everything in the inbox and returns the plan, writing nothing: expense rows, sales (paired), documents to read, copies, non-invoices, e-Fatura exports

scan_inbox

–

Lists the files in the inbox with their kind, whether they read like an invoice, and their status (new, read, filed)

extract

path, read_anyway

Reads one document and proposes how to book it. Text that does not read like an invoice is withheld unless read_anyway

file_document

path, name, dry_run

Moves a document into its year folder (expenses or income) under the proposed name. If it is a copy of a filed document, deletes the download instead

add_expense

row, dry_run

Adds a purchase; refuses duplicates and filed quarters

propose_income

invoice_path, at_document_path

Proposes one sale from your invoice and/or the Portal document

add_income

row, dry_run

Adds a sale

read_efatura / reconcile_efatura

csv_path (, year)

Reads an e-Fatura export / compares it with the books

missing

year

What is still missing, expenses and income

vat_return

quarter, year

The Declaração Periódica boxes for a quarter

mark_filed

quarter, year, return_pdf, dry_run, apply_pdf_values

Freezes and locks a submitted quarter, checked against the return PDF

income_totals

year

IRS and Segurança Social totals

create_year_sheet

year, opening_credit, dry_run

Creates a year's books and folders

index_year

year

Records the documents already filed, so copies are recognised

vat_codes

–

The VAT codes and the boxes each fills

Safety

  • Dry run first. Every tool that changes something shows what it would do first, and only acts when told to.

  • Files.

    • Documents are never overwritten.

    • Only files in the inbox are ever deleted, and only when they are copies of documents already filed.

    • Files that do not look like invoices are flagged and not read, unless you ask.

  • Books.

    • No duplicate rows.

    • Rows are kept sorted by date. The table is rewritten when sorting, so colours or fonts you add to its cells by hand may be reset.

    • A filed quarter's figures are frozen, and the tools refuse to add rows to it.

  • The workbook. Writes are atomic, so an interruption never leaves half a file. Nothing is written while the workbook is open elsewhere.

  • Numbers. The tools compute the boxes in Python, mirroring the workbook's formulas with spreadsheet rounding. The test suite recalculates a workbook in LibreOffice and checks both agree to the cent.

  • Internet is only used for ECB exchange rates. Without it, foreign-currency documents ask you for the rate.

Privacy: public code, private data

Everything personal stays outside this repository, under ~/.config/mcp-invoicesPT/:

In the repository

In your private folder

Document readers, Portuguese VAT rules, the layout of the books, the tools

config.yaml: NIF, folders, cards → accounts, supplier and client rules

Tests with made-up documents only

parsers/: your own parsers (e.g. your personal invoice template)

An example parser to adapt

The Google service-account key (Google backend only)

The ledger of files already handled (~/.local/share/mcp-invoicesPT/)

What the AI sees. Documents are read on your computer. The assistant receives what the tools return:

  • each document's fields;

  • the text of documents in unknown layouts;

  • never the text of files that do not look like invoices, unless you ask.

Your assistant's privacy terms apply to what it receives.

Adding a document type

A parser is a Python module with three things:

NAME = "acme"

def matches(text: str) -> bool:                    # is this document in my layout?
    return "ACME Cloud Ltd" in text and "Invoice number" in text

def parse(text: str, file: str = "") -> Document:  # read its fields
    ...

parse returns a Document with these fields: layer, doc_type, date, supplier, supplier_vat, country, invoice_no, currency, amount, vat_included, buyer_nif, markers and extra. Helpers for amounts in both number formats, dates in several languages, and country names are in documents/parsers/_common.py.

  • A company's layout that others may use: add it to src/invoices_pt/documents/parsers/, with a made-up sample in tests/test_parsers.py (never real data), and open a pull request. The registry picks it up automatically.

  • Something only you use (e.g. your own invoice template): put it in a private folder and set parsers_dir in the config. It is loaded at start-up and tried before the public parsers.

Tests

.venv/bin/pytest -q

The suite uses made-up documents only. It covers:

  • every parser, QR codes and the e-Fatura import;

  • VAT coding, filing and the inbox plan;

  • the missing-documents report and sales;

  • a complete workbook, with every box checked against hand-computed values (and recalculated in LibreOffice, if it is installed).

Opt-in checks against your own data:

INVOICES_PT_LIVE_SHEET=1 .venv/bin/pytest tests/test_live_layout.py -q
INVOICES_PT_PRIVATE=1 INVOICES_PT_YEAR=2026 .venv/bin/pytest tests/test_private_regression.py -q -s
  • test_live_layout.py (Google backend) builds temporary tabs in your sheet, checks every box, and removes them.

  • test_private_regression.py re-reads your filed documents and compares them with your booked rows.

Limitations

  • Quarterly filers only. The IVA you self-charge on reverse charge is at the mainland rate (23%). Monthly filing and the Azores and Madeira rates are not handled yet.

  • IRS: the figures assume the regime simplificado (Anexo B). Organised accounting is out of scope.

  • The return model: box numbers follow the Declaração Periódica valid until June 2027.

  • Photos: reading a paper receipt depends on how sharp its QR code is in the photo.

  • Windows is untested.

License

This is a tool I have been writing for myself first. I keep the generic part here, separate from any personal settings, so others can use it too.

MIT. You can use, change and share this freely, including commercially, as long as you keep the copyright notice. It comes as is, with no warranty of any kind: I do not guarantee that it is correct or fit for your situation, and it is not tax advice. Issues and pull requests are welcome.

Available Tools

16 tools
add_expenseA

Add one expense row to the year's expenses tab. row keys: date (YYYY-MM-DD), expense, supplier, country, supplier_vat, invoice_no, currency, amount, vat_included, fx, nif, code, business_pct, document, file, account. Refuses duplicates and quarters already filed. Call with dry_run=true first.

NameRequiredDescriptionDefault
rowYes
dry_runNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose real behavior: it mutates the year's expenses tab, rejects duplicates, and blocks writes to filed quarters. It does not cover permissions/auth, error shapes, or what dry_run actually returns, which leaves a gap for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the effect, then the field list, then the guardrails and dry-run instruction. Every clause carries information an agent needs before calling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the definition covers effect, field set, and refusal conditions. The remaining gap is the return behavior of dry_run and real runs, which an agent would want before deciding to proceed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the row object is a free-form nested object, so the description must compensate — and it does by enumerating all sixteen expected keys plus the date format (YYYY-MM-DD). It stops short of explaining the meaning or expected type of opaque keys like fx, business_pct, nif, and code.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: 'Add one expense row to the year's expenses tab.' An agent can immediately tell this from add_income or propose_income by the resource named. It doesn't explicitly name a sibling to differentiate against, keeping it just below a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete prerequisites and workflow: deduplication, refusal on already-filed quarters, and 'Call with dry_run=true first.' That is actionable when-to-use guidance. It lacks an explicit when-not or a pointer to alternative tools for bulk/other cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_incomeA

Add one sale to the year's income tab. row keys: invoice_date (YYYY-MM-DD), client, country, client_tax_id, invoice_no, recibo_no, recibo_date, currency, amount, fx, net_eur, vat_rate, vat_eur, withheld, vat_case, invoice_file, recibo_file, account. Refuses duplicates and filed quarters. Dry run first.

NameRequiredDescriptionDefault
rowYes
dry_runNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and partially discharges it: it discloses the duplicate/filed-quarter guards, the dry-run default, and the shape of the write. It does not say what a refusal returns, whether partial rows are accepted, or whether the write is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action, then the required payload, then the guardrails. The long key list is long but justified by the empty schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No annotations and no output schema, so the description must cover everything; it covers the payload and some failure modes but not the dry-run response, error semantics, or how amount/currency/fx combine. Adequate but with real gaps for a mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the row object is opaque (additionalProperties: true), so the enumerated key list is essential and includes a format hint (invoice_date YYYY-MM-DD). Meaning of individual fields (fx, net_eur, vat_case, withheld) is still left to inference, keeping it below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Add one sale to the year's income tab.' That cleanly separates it from add_expense (outflow) and propose_income (proposal vs. commit), though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Dry run first' gives a concrete workflow directive, and 'Refuses duplicates and filed quarters' implies when it will fail. But there is no explicit statement of when to use this versus propose_income or how to handle a refusal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_year_sheetB

Create a tax year's books: a local .xlsx workbook (default) or tabs in a Google Sheet, per the config. Expenses and income tables with the Declaração Periódica block (what to type each quarter, with the credit carried over), quarter sums, IRS / Segurança Social totals, formulas, dropdowns and formats. The opening credit (Q1 box 61) defaults to the previous year's Q4 box 96. Refuses to overwrite.

NameRequiredDescriptionDefault
yearYes
dry_runNo
opening_creditNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full burden. It usefully discloses a safety behavior ('Refuses to overwrite') and the content it generates (tables, quarter sums, formulas, dropdowns), but silently omits that dry_run defaults to true, which determines whether anything is actually written, and gives no indication of required auth/config or where the file lands.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the outcome, then the contents, then the default and the guardrail. Dense but every clause conveys something; the domain jargon (box 61/96, Declaração Periódica) slightly raises reading cost.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

It is a mutation-style creation tool with no annotations and no output schema, so the description should cover the default-dry-run trap and what is returned (file path or sheet URL). It covers generated content well but leaves those two agent-critical gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does explain opening_credit meaningfully (Q1 box 61, defaults to previous year's Q4 box 96), but 'year' is left implicit and dry_run — the single most consequential parameter given its true default — is never mentioned.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb+resource ('Create a tax year's books') plus the output artifacts (.xlsx workbook or Google Sheet tabs). It distinguishes itself from the read/analysis siblings (vat_return, index_year, income_totals) by being the constructor, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied ('per the config', 'refuses to overwrite', default opening credit from prior year Q4 box 96), but there is no explicit when-to-use vs when-not guidance and no pointers to siblings like index_year or add_expense once the sheet exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extractA

Read one invoice or receipt (PDF or photo). Returns the document fields, which layer read them (qr / parser: / text), a booking proposal (VAT code, region, ECB rate, payment account, business share, document label, file name) and a ready expense row. If a PDF does not read like an invoice or receipt, its text is withheld unless read_anyway=true, so unrelated documents are not exposed.

NameRequiredDescriptionDefault
pathYes
read_anywayNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and discloses useful behavioral details: extraction layers, return contents, and the safety behavior of withholding text for non-invoice PDFs unless read_anyway=true. It still does not explicitly confirm read-only behavior or describe error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then returns, then conditional behavior. Each sentence earns its place despite the dense return-value list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex extraction tool with no annotations, no output schema, and 0% schema coverage, the description does well on purpose and return behavior. It remains incomplete regarding path semantics, read-only guarantees, and error conditions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description explains the read_anyway parameter well in context. The required path parameter is only indirectly described as pointing to one invoice or receipt, without format or path details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: read one invoice or receipt (PDF or photo). It also specifies what is returned, but it does not explicitly differentiate this tool from siblings such as read_efatura or scan_inbox.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case is implied by 'Read one invoice or receipt' and the read_anyway condition is explained. However, there is no explicit guidance on when to choose this tool over sibling tools like read_efatura or scan_inbox.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

file_documentA

Move a document from the inbox into its tax-year folder under the proposed name (or name). If the same file or the same invoice is already filed, the inbox copy is deleted instead. Never overwrites and never deletes outside the inbox. e-Fatura CSV exports go to the year folder. Dry run first.

NameRequiredDescriptionDefault
nameNo
pathYes
dry_runNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the duplicate-collision rule (inbox copy deleted instead), the safety invariants (never overwrites, never deletes outside the inbox), and the special-case routing for e-Fatura CSV. It omits permissions requirements and what the tool reports back after filing or deleting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the primary action, then conditions and safety invariants in short declarative sentences. Every sentence adds a distinct rule; nothing is repeated from the schema or wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutation tool with no annotations and no output schema, the description covers behavior, edge cases, and safety well. The remaining gap is return-value information — what the caller sees after a file, a skip, or a dry run — which nothing else supplies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it names the role of each parameter: the inbox document (`path`), the name override (`name` defaulting to the proposed name), and the preview mode (`dry_run`, via "Dry run first"). It stops short of clarifying whether `path` is absolute or inbox-relative and what a dry run actually returns.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: moving a document out of the inbox into its tax-year folder. It names the destination, the naming rule, and the special e-Fatura CSV routing, which cleanly separates it from siblings like scan_inbox, plan_inbox, and mark_filed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Dry run first" gives an explicit ordering instruction, and "under the proposed name (or `name`)" implies this follows a prior planning step. It does not, however, name the sibling that produces the proposal (plan_inbox) or state when not to use this tool, so alternatives remain inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

income_totalsB

The IRS and Segurança Social totals at the top of the income tab, per quarter and for the year: gross income by invoice date (IRS), income by recibo date (Segurança Social quarterly declaration), and business expenses.

NameRequiredDescriptionDefault
yearYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It usefully discloses the date basis (invoice date for IRS, recibo date for Segurança Social) and quarterly/yearly granularity, implying a read-only reporting operation, but it does not explicitly state that it is non-mutating or mention any prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is front-loaded with the key resource and uses a colon list to add precise categories. It is dense but contains no obvious filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers the data categories and quarterly/yearly scope. However, with no annotations and 0% schema coverage for the sole parameter, it omits required year semantics and explicit behavioral guarantees.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description never mentions the required 'year' parameter or explains its format or meaning. It only refers to 'the year' as part of the output scope.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the resource: IRS and Segurança Social totals per quarter and for the year, broken down into gross income by invoice date, income by recibo date, and business expenses. It lacks an explicit verb and does not differentiate from sibling tools, but the intended output is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as add_income, propose_income, or vat_return. Usage is only implied by the phrase 'at the top of the income tab'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

index_yearA

Read every document already in the year's folders into the ledger, so later copies are recognised. Run it once per year (and again after moving files by hand).

NameRequiredDescriptionDefault
yearYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden; it does disclose that this mutates the ledger and is a prerequisite for dedup recognition, plus the rerun condition. It does not say whether reruns are idempotent, whether existing entries are overwritten, whether source files are touched, or what happens on partial failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler; the operative behavior comes first and the run cadence follows. The cadence and rerun condition are packed into one sentence but remain readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation with no annotations and no output schema, the definition covers what it does and when to run it, but leaves the agent guessing about idempotency, side effects on files, and the result. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one required parameter with 0% schema description coverage, so the description must compensate. 'The year's folders' and 'once per year' imply the parameter selects a fiscal year's folder set, but the expected format (e.g. 2024 vs 24) and scope are never specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and outcome: reads every existing document in the year's folders into the ledger. The phrase 'so later copies are recognised' explains the point of the operation, making the tool's role distinguishable in concept from scan_inbox or file_document, though no sibling is named directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit cadence guidance: 'Run it once per year (and again after moving files by hand)' tells the agent exactly when this must be invoked. It lacks any when-not-to-use or named alternative, which keeps it below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_filedA

After the user submits a quarter: freeze its declaration values, grey them and lock (warning-only) the quarter's block column, expense rows and income rows. If the submitted return PDF is in the year folder (or given), its boxes are compared with the sheet; apply_pdf_values=true copies the PDF's values over the frozen ones, since the submitted return is the source of truth. Dry run first.

NameRequiredDescriptionDefault
yearYes
dry_runNo
quarterYes
return_pdfNo
apply_pdf_valuesNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does substantial work: it discloses that values are frozen, that locking is 'warning-only' (soft, not blocking), that PDF boxes are compared against the sheet, and that apply_pdf_values=true overwrites frozen values because the submitted return is the source of truth. It still leaves unstated whether a filing can be undone/unlocked and what the dry run actually reports.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core mutation, then the PDF-comparison condition, then the operational directive 'Dry run first.' The second sentence is long and carries a stray line break, but every clause (locking target, overwrite precedence, dry run) adds actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter mutation tool with no annotations and no output schema, the description covers the mutation semantics well but omits what the tool returns or reports under dry_run, whether the filing is reversible, and the accepted quarter format. Given the tool irreversibly alters declaration state, at least the reversibility question should be answered here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description does explain dry_run, return_pdf and apply_pdf_values in prose, including the overwrite precedence rule. However, the required 'quarter' parameter is a free string with no enum and the description never specifies accepted format (e.g. 'Q1' vs '1'), and 'year' is only alluded to via 'the year folder' — real ambiguity an agent could trip on.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (freeze declaration values, grey and lock the quarter's block column, expense rows and income rows) triggered by a specific event (the user submits a quarter). The verb+resource is concrete, but it never contrasts itself with the many sibling tools (vat_return, file_document, index_year), so an agent must infer that this is the post-submission locking step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition ('After the user submits a quarter') and a sequencing instruction ('Dry run first'), which is genuine usage guidance. It stops short of naming alternatives or stating when-not to use it (e.g. when the quarter isn't submitted yet, or when the return PDF is absent and apply_pdf_values would be meaningless).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

missingA

What is still missing for a year: rows flagged MISSING, rows whose file is not in the folder, rows without a date, amount or invoice number, files in the folder no row books (and receipts that duplicate a booked payment), and months missing in monthly subscriptions. For income: sales without an AT document yet, missing files and unbooked files.

NameRequiredDescriptionDefault
yearYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does add real content by disclosing the specific checks performed (flagged rows, orphan files, duplicate receipts, missing months, income without AT documents). However, it never states that it is a read-only report, whether it writes anything to the sheet, or what the result looks like, leaving key behavioral traits unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The scope statement 'What is still missing for a year' is front-loaded, and each subsequent clause names a concrete check that adds information. The sentence is long and runs on, but nearly every clause earns its place as an enumerated check.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, no-output-schema reporting tool, the description covers the substantive question an agent needs answered: what the report contains. Gaps remain around output shape and read-only behavior, but the core scope is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description only implies the sole parameter via 'for a year', without clarifying whether that means calendar year, a specific year sheet, or the expected format for the integer. The single parameter is at least semantically reachable, but the description does not compensate for the empty schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description enumerates the exact categories of gaps the tool reports (MISSING rows, unbooked files, duplicate receipts, missing subscription months, unbooked income sales), making its purpose as a diagnostic gap report clear. It lacks an explicit verb (list/report) and does not contrast itself with siblings like reconcile_efatura or index_year, but the enumerated checks distinguish it well enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the enumerated checks suggest an audit/reconciliation scenario, but the description never says when to call this versus reconcile_efatura, vat_return, or index_year, nor does it state any preconditions. An agent can infer the intent but must guess at alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_inboxA

Read everything in the inbox and return the plan, without writing anything: expense rows ready for add_expense (with the file name for file_document and any checks to resolve), sales ready for add_income (your invoice paired with its AT document), documents to read yourself, copies, non-invoices, e-Fatura exports.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description must carry the full disclosure burden. It does declare non-mutation ('without writing anything') and enumerates return categories, but says nothing about cost, volume, or latency even though 'read everything in the inbox' implies a potentially large scan, and nothing about permissions needed to read the inbox.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence plus a colon-delimited enumeration: the action and the read-only guarantee come first, and the detail list follows. It is dense but each listed category corresponds to a downstream tool, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description must describe the result, and it does so via the enumerated plan categories, which is adequate. Remaining gaps are what the 'checks' resolution means and how to tell which items are safe to file automatically.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The description correctly adds no parameter noise.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read everything in the inbox and return the plan') plus the key constraint 'without writing anything', and enumerates the returned categories (expense rows, sales, documents to read, copies, non-invoices, e-Fatura exports). It never names the closest sibling (scan_inbox) to say how it differs, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The routing is clear: expense rows are 'ready for add_expense' (with file names for file_document), sales are 'ready for add_income'. This makes it plainly the pre-flight planning step before those mutation tools. However, it never explicitly says when not to use it, nor contrasts it with scan_inbox or extract.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_incomeB

Read one sale: your own invoice and/or the AT document issued on the Portal (recibo verde, fatura or fatura-recibo). Returns the income row (client, tax id, recibo no. and date, amount, rate, IVA, withholding, VAT case), the file names to file both under, and checks that the two documents belong together.

NameRequiredDescriptionDefault
invoice_pathNo
at_document_pathNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses what is returned and that the tool checks whether the two documents belong together, but it does not clarify side effects, permissions, error behavior, or whether anything is stored despite the 'propose_income' name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action, then lists the returned data and validation behavior. It is appropriately sized, though the long parenthetical and dense return-field list make it slightly less scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations, no output schema, and 0% schema description coverage, the description does a reasonable job covering the inputs, return fields, and document-matching check. It still leaves gaps around optional-parameter behavior, path semantics, and error or mismatch outcomes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains that the inputs are the user's invoice and/or the AT document (recibo verde, fatura, or fatura-recibo), which maps meaning onto the two path parameters, but it does not describe path format, defaults, or behavior when one path is omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: 'Read one sale' involving the invoice and/or AT document, and says it returns the income row. It is clear enough to distinguish a read/check operation from a write operation, though it does not explicitly name sibling alternatives such as add_income.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used when reading one sale and checking whether the invoice and AT document belong together, but it does not state when to use this tool versus siblings like add_income, file_document, or income_totals. No exclusions or alternative routing are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_efaturaB

Parse an e-Fatura CSV export into documents, each with a booking proposal.

NameRequiredDescriptionDefault
csv_pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It says the tool parses CSV data and produces documents with booking proposals, but does not disclose whether it writes to the system, whether proposals are persisted, whether the file is only read, or what happens on malformed input.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no wasted words and front-loads the action and result. It is appropriately sized for a one-parameter parsing tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values do not need to be explained. However, with no annotations and only a terse statement, the description leaves important context unstated, including whether the operation mutates state by creating booking proposals and how it relates to sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one required parameter, csv_path, with 0% schema description coverage. The description clarifies that the input is an 'e-Fatura CSV export', which adds useful meaning beyond the bare parameter name, but it does not specify path format, encoding, or expected CSV structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Parse an e-Fatura CSV export into documents, each with a booking proposal.' It is clear what the tool does and what it produces, though it does not explicitly distinguish itself from the sibling 'reconcile_efatura' or 'extract'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for parsing e-Fatura CSV exports, but it gives no explicit when-to-use guidance, prerequisites, or alternatives such as 'reconcile_efatura' or 'extract'. An agent must infer the selection context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reconcile_efaturaB

Compare an e-Fatura CSV export with the expenses tab: invoices not in the sheet, rows whose amount, VAT or invoice number differ (or that lack fields e-Fatura has), and Portuguese rows e-Fatura lacks.

NameRequiredDescriptionDefault
yearYes
csv_pathYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and leaves the key question unanswered: is this a pure read/compare or does it write discrepancies into the sheet? Nothing is said about side effects, whether the expenses tab must exist, what happens on a missing/malformed CSV, or how the report is presented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense sentence with no wasted preamble, front-loading the comparison before the parenthetical detail. The trailing list of discrepancy types is long but each item adds distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no annotations, so the description must cover both behavior and result shape; it does the former partially (what counts as a mismatch) but not the latter (structure of the returned report), and it omits prerequisites and failure modes. Adequate to understand intent, insufficient to call confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so both parameters rest on the description — which never mentions them. It does not say what format csv_path expects (local path, upload dir, required e-Fatura columns) or that year selects which year's expenses tab is compared. A caller must guess at the CSV's expected shape.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Compare') and both resources (an e-Fatura CSV export vs. the expenses tab), then enumerates the three discrepancy classes it surfaces. That enumeration effectively separates it from read_efatura or extract, though no sibling is named outright.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the output categories — an agent can infer this is the audit step after an e-Fatura export exists. There is no explicit 'use when' statement, no prerequisite note (e.g. the year's expenses tab must already exist), and no guidance on when a different sibling like read_efatura or missing is the better first call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_inboxA

List the files in the inbox folder (PDFs, images, e-Fatura CSVs), newest first: kind (document, not_an_invoice, efatura_export), whether a PDF reads like an invoice, its status in the ledger (new, extracted, filed) and whether it is an exact copy of another inbox file.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does real work: it discloses that listing involves classification (kind), content inspection ("whether a PDF reads like an invoice"), ledger-state lookup, and exact-duplicate detection — behavior an agent could not guess. It does not state cost/latency for scanning or explicitly confirm the operation is side-effect free, so it falls just short of full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and scope, and the parenthetical enumerations of kinds and statuses are compact. The second half is a long run-on field list that could be tightened, but every element conveys real information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return-value enumeration is partly redundant, but it usefully tells the agent what signals to look for (duplicate flags, invoice-likeness) before committing to follow-up tools. For a zero-parameter listing tool this is essentially complete; only the relationship to sibling workflow steps is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4; there is nothing to disambiguate and the description correctly avoids inventing filter arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List the files in the inbox folder") with an explicit scope and ordering (newest first), so it is immediately distinguishable from sibling tools like plan_inbox or index_year. It does not explicitly name a sibling it is not, but the inbox-listing scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is the discovery step before extract, file_document, or plan_inbox, but the description never says when to reach for it versus those alternatives, nor any preconditions (e.g., whether the inbox path must exist).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vat_codesB

The purchase and sales VAT codes the sheet understands, and which return boxes each one fills.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It describes domain content but does not state that the tool is read-only, what the return structure looks like, or any auth/side-effect constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single front-loaded sentence with no redundant text. That is appropriately terse for a simple zero-parameter reference tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, the description identifies the subject matter and mapping content well enough to know the tool's data scope. It does not describe the return format, but for a simple static reference this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and 100% schema description coverage, so the baseline score is 4. The description adds no parameter information, which is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the specific resource (purchase and sales VAT codes) and the mapping it exposes (return boxes), so an agent can tell what data it returns. It does not explicitly contrast with vat_return, but the scope is still discernible.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus vat_return or other siblings; the agent must infer it is a reference lookup. No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vat_returnB

The Declaração Periódica boxes for a quarter (Q1-Q4) as the sheet shows them, including the credit carried over (box 61) and the result boxes 90-96, and whether the quarter is already filed.

NameRequiredDescriptionDefault
yearYes
quarterYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden; it does signal a read-style retrieval and tells the agent what fields come back, including the filed flag. It does not disclose the data source (sheet vs e-fatura), permissions, or what happens for a quarter that has not been created/indexed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; every clause names a concrete piece of returned data. The phrasing 'as the sheet shows them' is slightly vague but does convey that values mirror the sheet layout.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must describe return values — and it does, listing box 61, boxes 90-96, and filing status. What remains missing is the source of truth and the behavior for unfiled or non-existent quarters, which matters for a two-parameter lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so compensation is required. The description clarifies the quarter parameter domain (Q1-Q4) and ties it to a specific reporting period, but says nothing about the required 'year' parameter or its relationship to a year sheet.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource — the Declaração Periódica boxes for a given quarter — and enumerates the contents (box 61 credit carried over, boxes 90-96 results, filed status). This clearly separates it from siblings like vat_codes (code lists) and mark_filed (mutation), though the retrieval verb is only implied by 'as the sheet shows them'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus alternatives such as vat_codes or mark_filed, and no prerequisites (e.g. whether the year must be indexed first). The agent must infer that this is the read path for a quarter's return.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 16 tool updatesv0.7.0
    • First observedadd_expense
    • First observedadd_income
    • First observedcreate_year_sheet
    • First observedextract
    • First observedfile_document
    • First observedincome_totals
    • First observedindex_year
    • First observedmark_filed
    • First observedmissing
    • First observedplan_inbox
    • First observedpropose_income
    • First observedread_efatura
    • First observedreconcile_efatura
    • First observedscan_inbox
    • First observedvat_codes
    • First observedvat_return

TDQS

A3.5/5.0

Scored across 16 tools

Disambiguation4/5

The tools mostly map to distinct workflow stages: inbox scanning/planning, document extraction, expense/income booking, filing, reconciliation, VAT reporting, and year-sheet lifecycle. There is some potential overlap around e-Fatura reading versus reconciliation and inbox planning versus scanning, but the descriptions make the intended boundaries fairly clear.

Naming Consistency4/5

All names use snake_case, and most follow a verb_noun pattern such as add_expense, file_document, reconcile_efatura, and create_year_sheet. A few departures like extract, missing, income_totals, vat_return, and vat_codes are still readable but slightly less predictable.

Tool Count4/5

Sixteen tools is slightly above the typical well-scoped range, but it is reasonable for a domain involving inbox processing, expenses, income, e-Fatura reconciliation, VAT returns, and tax-year sheet lifecycle. Each tool appears to cover a meaningful step rather than duplicating another.

Completeness4/5

The surface covers the main lifecycle: extracting documents, planning inbox work, adding expenses and income, filing documents, reconciling e-Fatura, checking missing items, generating VAT returns, creating year sheets, and marking quarters filed. Minor gaps remain around querying or updating/deleting individual booked rows, but core workflows are supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides complete Portuguese invoice management with 60+ specialized tools including invoice creation, client management, SAF-T tax compliance, treasury operations, and Portuguese Tax Authority (AT) integration for AI-powered business automation.
    0
    4
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Helps small business owners classify business documents and messages, extract key information like dates and amounts, generate action checklists, check missing documents, and draft business messages for accountants, clients, and employees.
    -
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI assistants to query and manage self-hosted accounting data—invoices, balances, and books—through natural language, with read-only tools by default and optional scoped write operations.
    30
    36 PyPI
    1
    AGPL 3.0
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to inspect and extract invoice metadata from PDFs, Word documents, Excel files, and images, then synchronize and enrich the extracted data into an Excel ledger.
    -