pennylane
comptabilité pennylane.
lecture comptable pennylane : factures clients et fournisseurs, transactions bancaires, balance sur période, plan comptable, exercices fiscaux, catégories — et lettrage transaction ↔ facture.
setup & usage
⚠ your pennylane api key
each user sets their own pennylane key — your books are visible only to you.
pennylane▸ read and reconcile your books
query invoices, transactions and the trial balance, and settle unmatched payments.
pennylane_trial_balance the trial balance over a period, pennylane_ref(kind="ledger_accounts") the chart of accountspennylane_invoice(op="list") / pennylane_supplier_invoice(op="list") the invoices, pennylane_transactions the bank movementspennylane_match matches a transaction to its invoice (reversible) so a paid invoice isn't left as latepennylane_quote(op="create") (no draft: it is born pending) → op="pdf" for the PDF link to attach to an email (the link expires, re-read it just before sending) → op="set_status" (accepted on signature) → op="to_invoice" creates the invoice as a draft, which pennylane_invoice(op="finalize") then pennylane_act(op="send_invoice") issue after human validationpennylane_upload_file (the PDF) → pennylane_supplier_invoice(op="import") (with import_as_incomplete=true, it stays in validation_needed) → op="lines" (the line ids and vat_rates) → op="update" (label, dates, amounts, and invoice_lines={"update": [{"id": …, "vat_rate": …}]}) → op="validate" moves it to complete: a binding accounting entry, only on the user's explicit request, never right after an importcurrency_amount_before_tax) is required at invoice level and rejected inside a line; a line carries currency_amount (incl. tax) and currency_taxvat_rate (v2 reference): intracom_21, intracom_55, intracom_85, intracom_100, extracom, crossborder, FR_85_construction, FR_100_construction, FR_200_construction; the reference doesn't define them any further and has no intracom_200 — the right code is decided with the accountantpennylane_ref(kind="category_groups") the axes, kind="categories" their categories → op="categories" reads, op="categorize" REPLACES the categories of a customer invoice, a supplier invoice (invoice_id) or a ledger entry line (pennylane_ledger_entry, line_id); weights as strings, summing to 1 per axis; [] removes them all_instance, the personal key answers first — to quote or invoice on behalf of the company, pass _instance="org:<id>:pennylane"pennylane_ref(kind="products") (resolve the product_id, never guess it) → pennylane_invoice(op="find") (duplicate check) → pennylane_invoice(op="credit_note") (standalone draft, lines in positive — the "credit note" negation is applied server-side) → pennylane_invoice(op="finalize") then pennylane_act(op="send_invoice") after human validation· project scope (#605, 2026-08-29)
pennylane_upload_file with a {kind: "url"} source reads that url server-side: under a project with excluded_url_prefixes, a matching url is refused, naming the reason (file_source seam). details: docs/projects.md.
⚙ multiple comptes
this connector accepts multiple comptes: each stored credential becomes a named account (one name per compte), at your level, your team's or your org's.
_account="<name>" on the tool; list them: oto_identity(op='list', connector='pennylane') (scope='org' or scope='group' for the org's or team's)oto_identity(op='set', connector='pennylane', identity_id='<name>'); rename: op='rename' with new_name_account) and adding upoutils
chargement…
utilisation
claude code — installe le plugin oto —
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.cli —
pipx install oto-cli puis oto pennylane …